单击按钮时WPF更改按钮上的xaml图标

新鲜的

我正在尝试创建用于锁定和解锁文本框的按钮,当禁用文本框时,该按钮显示一个锁定图标,而当启用文本框时,该按钮显示一个解锁的锁。

我已经阅读了大量文章,并在以下站点上发现了问题:单击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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改按钮上的内容模板单击 Wpf

来自分类Dev

单击时更改按钮类型上的文本

来自分类Dev

单击按钮图标更改

来自分类Dev

单击“ ionic 2”按钮时更改图标

来自分类Dev

单击时,向下滑动div并更改按钮图标

来自分类Dev

单击角度 2 中的按钮时更改字形图标

来自分类Dev

切换按钮 - 单击时更改图标

来自分类Dev

在XAML中单击时如何更改按钮图像

来自分类Dev

在Xaml中单击时如何更改按钮内容?

来自分类Dev

WPF / XAML:在按下按钮时更改TabControl SelectedItem

来自分类Dev

WPF单击更改按钮背景

来自分类Dev

WPF单击更改按钮背景

来自分类Dev

在 WPF 中单击时更改圆形按钮的颜色

来自分类Dev

如何在单击按钮时快速更改按钮图标,python

来自分类Dev

单击按钮时更改按钮值

来自分类Dev

单击按钮时如何更改按钮颜色

来自分类Dev

单击WPF上的按钮时如何播放不同的.wav

来自分类Dev

单击时更改按钮文本

来自分类Dev

单击按钮时更改片段

来自分类Dev

单击按钮时更改值

来自分类Dev

单击时更改按钮背景

来自分类Dev

单击时更改按钮颜色

来自分类Dev

单击按钮时更改 img

来自分类Dev

单击小部件上的按钮时更改布局

来自分类Dev

将鼠标悬停在XAML WPF上时,将按钮默认的突出显示颜色更改为透明颜色?

来自分类Dev

单击主表单上的按钮时如何更改辅助表单上的按钮的功能

来自分类Dev

更改按钮单击时不同按钮的按钮文本

来自分类Dev

单击期间的WPF按钮更改背景

来自分类Dev

WPF XAML格式:如何正确放置这些控件(并使按钮在单击时正常运行)