2

タッチスクリーンアプリ用のオンスクリーンキーボードを作成しています。Shiftキーを押すと、キーボード全体の大文字と小文字のボタンが切り替わります。

c#のコードは機能していますが、xamlのbool値で変更されるカスタムプロパティに基づいて、ボタンのコンテンツ値とコマンドパラメーターを変更する方法がわかりません。

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

これは、XAMLの各ボタンに対して現在持っているものです(ここでストローを把握しているため、コンテンツは無視してください)。Shiftキーを押すと、ContentとCommandParameterがLowerCaseKeyプロパティとUpperCaseKeyプロパティの間で切り替わります。

4

2 に答える 2

2

カスタムコントロール:

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)
)]
于 2012-10-03T14:07:17.070 に答える
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>
于 2012-10-03T12:39:08.247 に答える