WPF實現訊息中心

WPF實現訊息中心

本文將講解基於WPF實現一個訊息中心的功能,例如常見的軟體當中會經常收到伺服器端推送的「新聞」、「公告」等訊息。

最後更新 2022/5/11 上午7:31
juster.zhu
預計閱讀 4 分鐘
分類
WPF
標籤
.NET WPF

一、概要

本文將講解基於 WPF 實現一個訊息中心的功能,比如常見的軟體當中會經常收到服務端推送的「新聞」、「公告」等訊息。這個時候就需要對這個需求進行分析了。

功能分析如下:

  • 訊息內容顯示。
  • 訊息管理增、刪、批量刪除。
  • 訊息分類(通知類訊息、交互類型訊息例如可跳轉到某個連接或程式內的模組)
  • 訊息處理(接受、刪除、忽略)

二、實現

  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 即可,針對每一條訊息要有具體的處理。

例如:通知類訊息,只需要確定按鈕。

交互類型訊息,需要確認、刪除、忽略

 <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. 訊息分類

這裡就是在 Model 層定義好具體的枚舉即可。

/// <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. 訊息處理

訊息處理指的是,「確定」、「接受」、「忽略」這三個按鈕對訊息內容處理的邏輯,如果小夥伴需要可根據自己的需要修改。我這裡定義如下:

  • 確定:通常處理通知訊息,處理僅僅是從訊息列表中移除該項不做其他行為。
  • 接受:是處理交互類型的按鈕,處理從訊息列表中移除該項且觸發其他業務處理行為。
  • 忽略:處理所有類型訊息,只是不顯示在 UI 中但還會存在於訊息列表中下次或空閒時間處理訊息。
繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2025/1/26

WPF 藉助自訂 XML 檔案實現國際化

本文詳細介紹了在WPF程式中使用自訂XML檔案實現國際化的方法,包括安裝必備NuGet套件、動態獲取語言清單、動態切換語言、在程式碼和XAML介面中使用翻譯字串等內容,同時提供了原始碼連結,幫助開發者輕鬆實現WPF應用程式的國際化。

繼續閱讀