一、概要
本文将講解基于WPF實作一個消息中心的功能,比如常見的軟體當中會經常收到服務端推送的“新聞”、“公告”等消息。這個時候就需要對這個需求進行分析了。
功能分析如下:
- 消息内容顯示。
- 消息管理增、删、批量删除。
- 消息分類(通知類消息、互動類型消息例如可跳轉到某個連接配接或程式内的子產品)
- 消息處理(接受、删除、忽略)
二、實作
源碼位址:JusterZhu/2021PlanJ (github.com)
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>
2.消息管理增、删、批量删除
主要容器定下來之後那麼接下來每一項消息就是自定義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>
-
3.消息分類
這裡就是在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
-
}
4.消息處理
消息處理指的是,“确定”、“接受”、“忽略”這三個按鈕對消息内容處理的邏輯,如果小夥伴需要可根據自己的需要修改。 我這裡定義如下:
- 确定:通常處理通知消息,處理僅僅是從消息清單中移除該項不做其他行為。
- 接受:是處理互動類型的按鈕,處理從消息清單中移除該項且觸發其他業務處理行為。
- 忽略:處理所有類型消息,隻是不顯示在UI中但還會存在于消息清單中下次或空閑時間處理消息。