使用自定义属性XAML WPF动态设置content属性

时间:2012-10-03 10:46:32

标签: c# wpf xaml

我正在为触摸屏应用创建一个屏幕键盘,其中shift切换整个键盘上的大写和小写按钮。

c#中的代码正在运行,但我不知道如何根据我的自定义属性更改按钮的内容值和命令参数,该属性在boam值上更改为xaml。

<local:KeyboardButton Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="2" Command="{Binding AddText}" Content ="{Binding local:KeyboardButton.SelectedKey}" LowerCaseKey="`" UpperCasekey="¬"/>

这就是我目前对于XAML中的每个按钮(忽略内容,因为我一直在抓住这里的吸管),想法是shift键将切换LowerCaseKey和UpperCaseKey属性之间的Content和CommandParameter

2 个答案:

答案 0 :(得分:2)

也许你可以用风格和触发器实现你的目标:

    <Button Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="2" Command="{Binding AddText}" x:Name="AButton">
        <Button.Resources>
            <Style TargetType="Button">
                <Setter Property="Content" Value="{Binding Path=LowerCaseKey, ElementName=AButton}" />
                <Setter Property="CommandParameter" Value="{Binding Path=LowerCaseKey, ElementName=AButton}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsUpperCase}" Value="true">
                        <Setter Property="Content" Value="{Binding Path=UpperCasekey, ElementName=AButton}" />
                        <Setter Property="CommandParameter" Value="{Binding Path=UpperCasekey, ElementName=AButton}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Resources>
    </Button>

答案 1 :(得分:1)

自定义控制:

using System.Windows;
using System.Windows.Controls;

namespace Test
{
    public class KeyboardButton : Button
    {
        public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register("SelectedKey", typeof(string),
            typeof(KeyboardButton), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsArrange));

        public static readonly DependencyProperty IsUpperCaseProperty = DependencyProperty.Register("IsUpperCase", typeof(bool),
            typeof(KeyboardButton), new FrameworkPropertyMetadata(false));

        static KeyboardButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(KeyboardButton), new FrameworkPropertyMetadata(typeof(KeyboardButton)));
        }


        public string SelectedKey
        {
            get { return (string)GetValue(SelectedKeyProperty); }
            set { SetValue(SelectedKeyProperty, value); }
        }


        public string LowerCaseKey
        {
            get;
            set;
        }

        public string UpperCaseKey
        {
            get;
            set;
        }

        public bool IsUpperCase
        {
            get { return (bool)GetValue(IsUpperCaseProperty); }
            set { SetValue(IsUpperCaseProperty, value); }
        }
    }
}

Themes \ Generic.xaml(Themes文件夹中的文件Generic.xaml)

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Test">


    <Style TargetType="{x:Type local:KeyboardButton}" BasedOn="{StaticResource {x:Type Button}}"> 
        <Setter Property="Content" Value="{Binding LowerCaseKey, Mode=OneTime, RelativeSource={RelativeSource Self}}"/>
        <Style.Triggers>
            <Trigger Property="IsUpperCase" Value="true">
                <Setter Property="Content" Value="{Binding UpperCaseKey, Mode=OneTime, RelativeSource={RelativeSource Self}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ResourceDictionary>

请勿在AssemblyInfo.cs中忘记这一点:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
)]