0

我创建了一个具有 3 种状态(正常、单击、禁用)的自定义 WPF 按钮。对于每个州,我都有不同的形象。我在项目的不同位置使用这个通用按钮,每次我使用 .CS 文件中的属性加载不同的图像时。

<Button.Resources>
    <ImageSource x:Key="Normal">..\Resources\DefaultNormal.png</ImageSource>
    <ImageSource x:Key="Disabled">..\Resources\DefaultDisabled.png</ImageSource>
    <ImageSource x:Key="Pressed">..\Resources\DefaultPressed.png</ImageSource>
</Button.Resources>
<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
            <Image Name="normal" Source="{DynamicResource Normal}" Stretch="Fill"/>
            <Image Name="pressed" Source="{DynamicResource Pressed}" Stretch="Fill" Visibility="Hidden"/>
            <Image Name="disabled" Source="{DynamicResource Disabled}" Stretch="Fill" Visibility="Hidden"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter TargetName="normal" Property="Visibility" Value="Hidden"/>
                <Setter TargetName="pressed" Property="Visibility" Value="Visible"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="normal" Property="Visibility" Value="Hidden"/>
                <Setter TargetName="disabled" Property="Visibility" Value="Visible"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Button.Template>

现在我想对按钮的文本/内容做同样的事情,但我找不到类似于ImageSource文本的东西。有类似的东西吗?还是有不同的方法来动态更改文本?

4

2 回答 2

2

看起来您只需要在控件模板中添加一个新元素;然后您可以在触发器中访问它。

<ControlTemplate TargetType="{x:Type Button}">
    <Grid>
        <Image Name="normal" Source="{DynamicResource Normal}" Stretch="Fill"/>
        <Image Name="pressed" Source="{DynamicResource Pressed}" Stretch="Fill" Visibility="Hidden"/>
        <Image Name="disabled" Source="{DynamicResource Disabled}" Stretch="Fill" Visibility="Hidden"/>
        <TextBlock Name="text" Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="IsPressed" Value="True">
            <Setter TargetName="normal" Property="Visibility" Value="Hidden"/>
            <Setter TargetName="pressed" Property="Visibility" Value="Visible"/>
            <Setter TargetName="text" Property="Text" Value="Pressed :)"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="normal" Property="Visibility" Value="Hidden"/>
            <Setter TargetName="disabled" Property="Visibility" Value="Visible"/>
            <Setter TargetName="text" Property="Text" Value="Disabled :("/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

在这里,我TextBlock在图像上添加了一个,并更改了按下/禁用状态的文本。


如果您想将文本字符串作为资源添加到控件中,请使用System命名空间来引用该String类型。 xmlns:clr="clr-namespace:System;assembly=mscorlib

<Button.Resources>
    <clr:String x:Key="NormalText">Normal</clr:String>
    <clr:String x:Key="DisabledText">Disabled</clr:String>
    <clr:String x:Key="PressedText">Pressed</clr:String>
</Button.Resources>
于 2012-10-03T16:05:05.760 回答
0

尝试这个:

1)添加到命名空间:

xmlns:system="clr-namespace:System;assembly=mscorlib"

2)添加到资源这个条目:

<system:String x:Key="myMessage">Button state: clicked!</system:String>

现在您可以在TextBlockText 属性中使用“myMessage”或作为Button内容:

<Button Content="{StaticResource myMessage}" />
于 2012-10-03T16:07:47.937 回答