gpt4 book ai didi

wpf - 如何将 ViewModel 变量用于 DynamicResource?

转载 作者:行者123 更新时间:2023-12-03 01:57:29 24 4
gpt4 key购买 nike

这不是 MahApps.Metro 特定的,但这恰好是我正在使用的。我有一组 ViewModel,它们有一个 string 属性,表示要使用资源 XAML 文件中的图标。

public class CommandViewModel : ViewModel
{
public CommandViewModel(string displayName, ICommand command, string icon)
{
if (command == null)
throw new ArgumentNullException("command");

DisplayName = displayName;
Command = command;
Icon = icon;
}

public ICommand Command { get; private set; }
public string Icon { get; set; }
}

Icon 最终将类似于 MahApps.Metro.Resources 中的“appbar_add”。这些是在 Icons.xaml 文件中定义的。

如何将其写入我的 ItemTemplate 中,以便显示正确的资源。我要么在执行时遇到错误(不是在编辑/构建时),要么根本没有图标。

“无图标”XAML 如下所示:

<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Width="20" Height="20">
<Rectangle.Fill>
<VisualBrush Visual="{DynamicResource {Binding Path=Icon}}" />
</Rectangle.Fill>
</Rectangle>
<TextBlock Margin="15,6">
<Hyperlink Command="{Binding Path=Command}">
<TextBlock Text="{Binding Path=DisplayName}" />
</Hyperlink>
</TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

我尝试使用 StaticResource 导致错误,我认为这从根本上来说是不正确的。

我应该如何引用 Icon 属性作为我想要的资源的名称?

编辑

请求了更多代码,因此下面是一个示例,说明其功能:

<Rectangle Width="20" Height="20">
<Rectangle.Fill>
<VisualBrush Visual="{StaticResource appbar_add}" />
</Rectangle.Fill>
</Rectangle>

我需要做的是让“appbar_add”成为我的 ViewModel 上的属性(上面的 Icon 属性)的值。

资源位于单独文件 (Icon.xaml) 的 ResourceDictionary 中,如下所示:

<Canvas x:Key="appbar_add" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
<Path Width="38" Height="38" Canvas.Left="19" Canvas.Top="19" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 35,19L 41,19L 41,35L 57,35L 57,41L 41,41L 41,57L 35,57L 35,41L 19,41L 19,35L 35,35L 35,19 Z "/>
</Canvas>

最佳答案

您可以使用转换器来完成这项工作。引用下面的代码。我有两种样式可以在 Icon.xaml 中将 + 符号设置为红色或黑色。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas x:Key="appbar_add_Black" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
<Path Width="38" Height="38" Canvas.Left="19" Canvas.Top="19" Stretch="Fill" Fill="Black" Data="F1 M 35,19L 41,19L 41,35L 57,35L 57,41L 41,41L 41,57L 35,57L 35,41L 19,41L 19,35L 35,35L 35,19 Z "/>
</Canvas>
<Canvas x:Key="appbar_add_Red" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
<Path Width="38" Height="38" Canvas.Left="19" Canvas.Top="19" Stretch="Fill" Fill="Red" Data="F1 M 35,19L 41,19L 41,35L 57,35L 57,41L 41,41L 41,57L 35,57L 35,41L 19,41L 19,35L 35,35L 35,19 Z "/>
</Canvas>
</ResourceDictionary>

请参阅查看代码。

<Window.Resources>
<local:IconConverter x:Key="conv"/>
</Window.Resources>
<Grid>
<Rectangle Width="20" Height="20">
<Rectangle.Fill>
<VisualBrush Visual="{Binding Icon,Converter={StaticResource conv}}" />
</Rectangle.Fill>
</Rectangle>
</Grid>

View 模型

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new CommandViewModel("Red");
}
}

public class CommandViewModel :INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public CommandViewModel(string icon)
{
Icon = icon;
}

private string icon;

public string Icon
{
get { return icon; }
set { icon = value; }
}
}

class IconConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = (string)value;
ResourceDictionary myResourceDictionary = new ResourceDictionary();
myResourceDictionary.Source =
new Uri("Icon.xaml",
UriKind.Relative);
if (str.Equals("Black"))
{
return myResourceDictionary["appbar_add_Black"];
}
else
{
return myResourceDictionary["appbar_add_Red"];
}
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

关于wpf - 如何将 ViewModel 变量用于 DynamicResource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29396976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com