我正在尝试创建用于锁定和解锁文本框的按钮,当禁用文本框时,该按钮显示一个锁定图标,而当启用文本框时,该按钮显示一个解锁的锁。
我已经阅读了大量文章,并在以下站点上发现了问题:单击WPF更改按钮背景图片
我接受了答案,并提出了这个建议。
<Button Grid.Row="0" Command="{Binding ChangePnumTextState}" CommandParameter="{Binding ElementName=ButtonCanvas, Path=Source}">
<Canvas Name="ButtonCanvas">
<Canvas.Style>
<Style TargetType="{x:Type Canvas}">
<Style.Triggers>
<DataTrigger Binding="{ Binding IsPNumLocked}" Value="True">
<Setter Property="Source" Value="{StaticResource appbar_lock}" />
</DataTrigger>
<DataTrigger Binding="{ Binding IsPNumLocked}" Value="False">
<Setter Property="Source" Value="{StaticResource appbar_unlock}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Canvas.Style>
</Canvas>
</Button>
我已将这批图标http://modernuiicons.com/导入到xaml文件中,该文件在需要时会被绘制
我环顾四周,只是找不到如何使用SVG(而不是图像)执行此操作的任何示例
编辑
好的,有人指出,SVG不能与wpf一起使用,我可能只是在混淆名称,这是我在资源库中用于获取图标的代码示例
<Canvas x:Key="appbar_3d_obj" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
<Path Width="40" Height="40" Canvas.Left="18" Canvas.Top="18" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 18,21.7037L 43.9259,18L 58,25.4074L 58,54.2963L 32.8148,58L 18,49.1111L 18,21.7037 Z "/>
</Canvas>
我遇到的错误是Visual Studio在Setters和状态中强调了Property
“成员'来源'未被识别或无法访问”
您现在使用的XAML存在一些问题。
正如其他人指出的那样,WPF画布上没有Source属性。如果您要做的只是使已经定义的按钮内容画布成为可能,则可以使用相同的技术将Button的Content属性绑定到App.xaml中定义的Canvas(或可能在任何位置) )
您可能遇到的另一个问题是数据触发器中的绑定。我尚未测试,但我想您在用户控件(或包含按钮的任何内容)所期望的样式中不会有相同的数据上下文,我想数据上下文似乎不是问题我当时正在考虑模板问题
另外,我不确定您的ChangePnumTextState命令在做什么,但是是否有原因要在画布中作为参数发送?如果您的命令只是更改IsPnumLocked上的bool值,则您应该能够处理XAML中的所有内容并保持关注点分离。
这是一个简单的更改,以使按钮的内容成为您定义的Canvas:
<Button Command="{Binding ChangePnumTextState}">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsPNumLocked}" Value="True">
<Setter Property="Content" Value="{StaticResource appbar_lock}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsPNumLocked}" Value="False">
<Setter Property="Content" Value="{StaticResource appbar_unlock}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
请注意,我们只是尝试将按钮的内容设置为您已经定义的画布,而不是尝试设置画布的来源。
绑定上的RelativeSource也应注意数据上下文的解析(尽管您需要确保搜索的相对源具有您想要的数据上下文)
编辑:另一种方法是根据布尔值(我假设IsPNumLocked是)为您的画布路径创建一个转换器。然后,您可以将画布作为按钮内容的子元素,并且包含其他内容也将更加容易。
转换器示例:
public class IsPnumLockedToCanvasPathConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool val = (bool)value;
return val
? "F1 M 22.17,36.4216L 25.3369,36.4216L 25.3369,31.6711C 25.3369,24.6745 31.0087,19.0027 38.0053,19.0027C 45.0019,19.0027 50.6737,24.6745 50.6737,31.6711L 50.6737,36.4216L 53.841,36.4216L 53.8411,57.008L 22.17,57.008L 22.17,36.4216 Z M 45.9231,31.6711C 45.9231,27.2982 42.3782,23.7533 38.0053,23.7533C 33.6324,23.7533 30.0875,27.2982 30.0875,31.6711L 30.0875,36.4216L 45.923,36.4216L 45.9231,31.6711 Z "
: "F1 M 22.1698,36.4215L 25.3366,36.4215L 25.3367,31.6711C 25.3367,24.6745 31.0085,19.0027 38.0051,19.0027C 45.0017,19.0027 50.6735,24.6745 50.6735,31.6711L 45.9228,31.6711C 45.9228,27.2982 42.3779,23.7533 38.0051,23.7533C 33.6322,23.7533 30.0873,27.2982 30.0873,31.6711L 30.0873,36.4216L 53.8408,36.4215L 53.8409,57.008L 22.1698,57.008L 22.1698,36.4215 Z ";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
您的按钮可以像这样设置:
<Button Command="{Binding ChangePnumTextState}">
<Button.Resources>
<converters:IsPnumLockedToCanvasPathConverter x:Key="IsPnumLockedToCanvasPathConverter"/>
</Button.Resources>
<StackPanel Orientation="Vertical">
<Canvas Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
<Path Width="40" Height="40" Canvas.Left="18" Canvas.Top="18" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="{Binding IsPNumLocked, Converter={StaticResource IsPnumLockedToCanvasPathConverter}}"></Path>
</Canvas>
<TextBlock Text="Other Content"/>
</StackPanel>
</Button>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句