WPFはメッセージセンターを実装

WPFはメッセージセンターを実装

この記事では、一般的なソフトウェアがサーバーから頻繁に受信する“ニュース”や“お知らせ”などのメッセージを含む、WPFベースのメッセージセンターを実装する機能について説明します。

最后更新 2022/05/11 7:31
juster.zhu
预计阅读 3 分钟
分类
WPF
标签
.NET WPF

I.概要

この記事では、一般的なソフトウェアがサーバーから頻繁に受信する“ニュース”や“お知らせ”などのメッセージを含む、WPFベースのメッセージセンターを実装する機能について説明します。この時点で、ニーズを分析する必要があります。

機能分析は以下の通り。

  • メッセージ内容が表示される。
  • メッセージ管理追加、削除、一括削除。
  • メッセージの分類(通知クラスメッセージ、プログラム内の接続やモジュールにジャンプするなどの対話型メッセージ)
  • メッセージ処理受入、削除、

II.達成する

  1. メッセージの内容表示 ここでは、メッセージ自体が複数のアイテムのコンテンツであり、各アイテムを操作する必要があるListboxのカスタムコントロールを考えます。
  <ListBox
    Grid.Row="1"
    MaxHeight="335"
    Background="{x:Null}"
    BorderThickness="0"
    ItemContainerStyle="{DynamicResource ListBoxItemStyle}"
    ItemsSource="{Binding MessageItem}"
    ScrollViewer.HorizontalScrollBarVisibility="Hidden">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type localModel:MessageItemModel}">
            <Border
                Height="30"
                BorderBrush="#FFBDBDBD"
                BorderThickness="0,0,0,0.6">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="40" />
                    </Grid.ColumnDefinitions>
                    <DockPanel>
                        <Label
                            MaxWidth="70"
                            Content="{Binding Path=Name}"
                            Foreground="Red"
                            ToolTip="{Binding Path=Name}" />
                        <Label
                            MaxWidth="130"
                            Content="{Binding Path=Content}"
                            Foreground="White"
                            ToolTip="{Binding Path=Content}" />
                    </DockPanel>
                    <CheckBox
                        Grid.Column="1"
                        FlowDirection="RightToLeft"
                        IsChecked="{Binding Path=CheckBoxState}" />
                </Grid>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
  1. メッセージ管理追加、削除、一括削除

メインコンテナが設定されると、次の各メッセージはカスタムListboxItemになり、各メッセージに特定の処理が必要になります。

例:通知クラスメッセージはOKボタンのみが必要です。

対話型メッセージ、確認、削除、無視が必要

 <DataTemplate x:Key="SelectedTemplate" DataType="{x:Type localModel:MessageItemModel}">
     <Border BorderBrush="#FFBDBDBD" BorderThickness="0,0,0,0.6">
         <StackPanel>
             <TextBox
                 MaxWidth="240"
                 MaxHeight="200"
                 Padding="0,5,0,0"
                 HorizontalAlignment="Center"
                 VerticalAlignment="Center"
                 Background="Transparent"
                 BorderThickness="0"
                 FontSize="14"
                 Foreground="White"
                 IsReadOnly="True"
                 Text="{Binding Path=Content}"
                 TextAlignment="Center"
                 TextWrapping="WrapWithOverflow"
                 ToolTip="{Binding Path=Content}"
                 VerticalScrollBarVisibility="Auto" />
             <StackPanel
                 Margin="5,5,5,9"
                 HorizontalAlignment="Center"
                 VerticalAlignment="Center"
                 Orientation="Horizontal">
                 <Button
                     Width="60"
                     Height="25"
                     Margin="5"
                     Command="{Binding DataContext.ClickAcceptCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
                     CommandParameter="{Binding}"
                     Content="接受"
                     Style="{StaticResource BlueButtonStyle}"
                     Visibility="{Binding Path=InvitationType, Converter={StaticResource BooleanToVisibilityConverter}}" />
                 <Button
                     Width="60"
                     Height="25"
                     Margin="5"
                     Command="{Binding DataContext.ClickRefuseCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
                     CommandParameter="{Binding}"
                     Content="忽略"
                     Style="{StaticResource BlueButtonStyle}"
                     Visibility="{Binding Path=InvitationType, Converter={StaticResource BooleanToVisibilityConverter}}" />
                 <Button
                     Width="60"
                     Height="25"
                     Margin="5"
                     Command="{Binding DataContext.ClickAgreeCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
                     CommandParameter="{Binding}"
                     Content="确认"
                     Style="{StaticResource BlueButtonStyle}"
                     Visibility="{Binding Path=NoticeType, Converter={StaticResource BooleanToVisibilityConverter}}" />
             </StackPanel>
         </StackPanel>
     </Border>
 </DataTemplate>
  1. メッセージの分類

ここでは、モデルレベルで特定の列挙を定義するだけです。

/// <summary>
/// 消息处理结果
/// </summary>
public enum SysMessageResult
{
    /// <summary>
    /// 未处理
    /// </summary>
    Unhandled = 0,
    /// <summary>
    /// 同意
    /// </summary>
    Processed = 1
}

/// <summary>
/// 消息类型
/// </summary>
public enum SysMessageType
{
    /// <summary>
    /// 通知类型
    /// </summary>
    NoticeType = 0,
    /// <summary>
    /// 其他类型
    /// </summary>
    OtherType = 1
}
  1. メッセージの処理

メッセージ処理とは、“OK”、“Accept”、“無視”の3つのボタンがメッセージ内容を処理するロジックを指し、パートナーが必要に応じて変更できます。ここで定義します。

  • OK:通常、通知メッセージを処理します。処理は単にメッセージリストから項目を削除するだけで、他の動作はしません。
  • Accept:対話型を処理し、メッセージリストから項目を削除し、その他のビジネス処理動作をトリガーするボタンです。
  • 無視:UIに表示されないすべてのタイプのメッセージを処理しますが、次回または空き時間にメッセージのリストに残ります。
Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2025/09/13

WPFからAvaloniaへの移行シリーズ:WPFプログラムをAvaloniaに移行する必要がある理由

ここ数年、当社のホストソフトウェアは主にWPFとWin Formで開発されてきました。これらのテクノロジーはWindowsプラットフォームで非常にうまく機能し、小規模なパイロット生産から今日の大規模なデリバリまでの段階を経てきました。しかし、ビジネスの成長と顧客のニーズの変化に伴い、単一のWindowsテクノロジースタックは私たちが乗り越えなければならないハードルになりました。

继续阅读
同分类 / 同标签 2025/01/26

WPFはカスタムXMLファイルで国際化を実現

この記事では、必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードとxamlインターフェイスでの翻訳文字列の使用、開発者がWPFアプリケーションを簡単に国際化できるようにするソースコードへのリンクなど、WPFプログラムでカスタムXMLファイルを使用した国際化の方法について詳しく説明します。

继续阅读