【6月日新计划20】WPF入门-功能加強
learn.microsoft.com/zh-cn/dotne…
1. 根據值的狀態來判斷顯示的顏色
<Border
Grid.RowSpan="2"
CornerRadius="3">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="0">
<Setter Property="Background" Value="#1E90FF"/>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="1">
<Setter Property="Background" Value="#3CB371"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
2. List展示,有值則遍歷,沒有則顯示圖片
<StackPanel Grid.Row="1" VerticalAlignment="Center"
Visibility="{Binding ToDoDtos.Count,Converter={StaticResource IntToVisibility}}"
>
<Image Source="/Images/wind.png" Width="120" Height="120"/>
<TextBlock Margin="0,10" FontSize="18"
HorizontalAlignment="Center"
Text="尝试添加一些待办事项,以便在此处查看它们。"/>
</StackPanel>
<ScrollViewer Grid.Row="1">
<ItemsControl HorizontalAlignment="Center" ItemsSource="{Binding ToDoDtos}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<md:TransitioningContent OpeningEffect="{md:TransitionEffect Kind=ExpandIn}">
<Grid
Width="220"
MinHeight="180"
MaxHeight="250"
Margin="8">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonUp">
<i:InvokeCommandAction
CommandParameter="{Binding}"
Command="{Binding DataContext.SelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<md:PopupBox HorizontalAlignment="Right" Panel.ZIndex="1">
<Button Content="删除"
CommandParameter="{Binding}"
Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}"
/>
</md:PopupBox>
<Border
Grid.RowSpan="2"
CornerRadius="3">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="0">
<Setter Property="Background" Value="#1E90FF"/>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="1">
<Setter Property="Background" Value="#3CB371"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
<TextBlock
Padding="10,5"
FontWeight="Bold"
Text="{Binding Title}" />
<TextBlock
Grid.Row="1"
Padding="10,5"
Text="{Binding Content}" />
<Canvas Grid.RowSpan="2" ClipToBounds="True">
<Border
Canvas.Top="10"
Canvas.Right="-50"
Width="120"
Height="120"
Background="#FFFFFF"
CornerRadius="100"
Opacity="0.1" />
<Border
Canvas.Top="80"
Canvas.Right="-30"
Width="120"
Height="120"
Background="#FFFFFF"
CornerRadius="100"
Opacity="0.1" />
</Canvas>
</Grid>
</md:TransitioningContent>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
3. utils
Int類型轉Boolean
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace MyToDo.Common.Converters
{
public class IntToBoolConveter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null && int.TryParse(value.ToString(), out int result))
{
if (result == 0)
return false;
}
return true;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value!=null&&bool.TryParse(value.ToString(), out bool result))
{
if (result)
return 1;
}
return 0;
}
}
}
Int類型轉屬性是否顯示
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace MyToDo.Common.Converters
{
public class IntToVisibilityConveter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null&&int.TryParse(value.ToString(), out int result))
{
if (result == 0)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
4. 解耦
比如我的頁面遍歷一個集合,右上角還有一個添加的按鈕
-
首先,創建一個AddView.xaml,可以寫的寬泛一點,方便共用
-
按鈕的方法就是將Dialog顯示出來
namespace MyToDo.ViewModels
{
public class IndexViewModel : NavigationViewModel
{
private readonly IDialogHostService dialog;
private readonly IRegionManager regionManager;
public DelegateCommand<string> ExecuteCommand { get; private set; }
public DelegateCommand<TaskBar> NavigateCommand { get; private set; }
public IndexViewModel(IDialogHostService dialog) : base(provider)
{
CreateTaskBars();
ExecuteCommand = new DelegateCommand<string>(Execute);
this.regionManager = provider.Resolve<IRegionManager>();
this.dialog = dialog;
NavigateCommand = new DelegateCommand<TaskBar>(Navigate);
}
//路由到其他頁面
private void Navigate(TaskBar obj)
{
if (string.IsNullOrWhiteSpace(obj.Target)) return;
NavigationParameters param = new NavigationParameters();
if (obj.Title == "已完成")
{
param.Add("Value", 2);
}
regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(obj.Target, param);
}
private void Execute(string obj)
{
switch (obj)
{
case "新增待办": AddToDo(null); break;
case "新增备忘录": AddMemo(null); break;
}
}
/// <summary>
/// 添加待办事项
/// </summary>
async void AddToDo(ToDoDto model)
{
DialogParameters param = new DialogParameters();
if (model != null)
param.Add("Value", model);
var dialogResult = await dialog.ShowDialog("AddToDoView", param);
if (dialogResult.Result == ButtonResult.OK)
{
try
{
UpdateLoading(true);
var todo = dialogResult.Parameters.GetValue<ToDoDto>("Value");
if (todo.Id > 0)
{
var updateResult = await toDoService.UpdateAsync(todo);
if (updateResult.Status)
{
var todoModel = summary.ToDoList.FirstOrDefault(t => t.Id.Equals(todo.Id));
if (todoModel != null)
{
todoModel.Title = todo.Title;
todoModel.Content = todo.Content;
}
}
}
else
{
var addResult = await toDoService.AddAsync(todo);
if (addResult.Status)
{
summary.Sum += 1;
summary.ToDoList.Add(addResult.Result);
summary.CompletedRatio = (summary.CompletedCount / (double)summary.Sum).ToString("0%");
this.Refresh();
}
}
}
finally
{
UpdateLoading(false);
}
}
}
/// <summary>
/// 添加备忘录
/// </summary>
async void AddMemo(MemoDto model)
{
DialogParameters param = new DialogParameters();
if (model != null)
param.Add("Value", model);
var dialogResult = await dialog.ShowDialog("AddMemoView", param);
if (dialogResult.Result == ButtonResult.OK)
{
try
{
UpdateLoading(true);
var memo = dialogResult.Parameters.GetValue<MemoDto>("Value");
if (memo.Id > 0)
{
var updateResult = await memoService.UpdateAsync(memo);
if (updateResult.Status)
{
var todoModel = summary.MemoList.FirstOrDefault(t => t.Id.Equals(memo.Id));
if (todoModel != null)
{
todoModel.Title = memo.Title;
todoModel.Content = memo.Content;
}
}
}
else
{
var addResult = await memoService.AddAsync(memo);
if (addResult.Status)
{
summary.MemoList.Add(addResult.Result);
}
}
}
finally
{
UpdateLoading(false);
}
}
}
void CreateTaskBars()
{
TaskBars = new ObservableCollection<TaskBar>();
TaskBars.Add(new TaskBar() { Icon = "ClockFast", Title = "汇总", Color = "#FF0CA0FF", Target = "ToDoView" });
TaskBars.Add(new TaskBar() { Icon = "ClockCheckOutline", Title = "已完成", Color = "#FF1ECA3A", Target = "ToDoView" });
TaskBars.Add(new TaskBar() { Icon = "ChartLineVariant", Title = "完成比例", Color = "#FF02C6DC", Target = "" });
TaskBars.Add(new TaskBar() { Icon = "PlaylistStar", Title = "备忘录", Color = "#FFFFA000", Target = "MemoView" });
}
public override async void OnNavigatedTo(NavigationContext navigationContext)
{
var summaryResult = await toDoService.SummaryAsync();
if (summaryResult.Status)
{
Summary = summaryResult.Result;
Refresh();
}
base.OnNavigatedTo(navigationContext);
}
}
}