0

フォームでラベル スタイルを動的に変更しようとしています。私が望む動作は次のとおりです。たとえば、「txtName」という名前のテキスト ボックスがフォーカスされるたびに、「lblName」という名前のラベル コントロールを検索し、その FontWeight プロパティを「Bold」に変更する必要があります。

'txtBirthday' という名前のテキスト ボックスと 'lblBirthday' という名前のラベルについても同じです。ここで、'txt' は TextBox を表し、lbl は Label を表します。

すべてのテキストボックスには、対応するラベルの名前とプレフィックス「txt」とプレフィックス「lbl」がありますが、テキストボックスが対応するラベルを見つけられない場合は何もしません。

言い換えれば、Textbox がフォームにフォーカスされるたびに、その説明のために「責任がある」というラベルを検索し、それを強調表示 (フォントの太さを太字に変更) して、フォームがよりユーザーフレンドリーになるようにする必要があります。そうすれば、ユーザーはどのテキストボックスに入力しているのか混乱することはありません.

おそらく良い出発点となるコードの平和がありますが、非静的コントロール名を操作する方法がわかりません。

    <Style TargetType="{x:Type Label}">

    <Style.Triggers>
        <!-- Here is how we bind to another control's property -->
        <DataTrigger Binding="{Binding IsFocused, ElementName=txtUser}" Value="True">
            <Setter Property="FontWeight" Value="Bold" />
            <!-- Here is the 'override' content -->
        </DataTrigger>

    </Style.Triggers>

</Style>
4

2 に答える 2

0

すべてのgotfocusを同じイベントに移動させることができます。送信者はイベントに渡されるため、送信者の名前を取得できます。コードビハインドでは、XAMLでは使用できない変数とロジックを使用できます。

于 2011-12-18T15:43:18.780 に答える
0

上記のコメントで述べたように、視覚的な動作を適用するための基礎として要素名を検索してパターン マッチングする手法は、堅牢ではありません。たとえば、タイプミスをして「lbl」の代わりに「lbel」を使用するとどうなりますか? Labelsまたは、後ですべてを置き換えることにした場合はどうTextBlocksなりますか?動作を維持するために、名前に「lbl」というプレフィックスを付けますか? コードを使用してビジュアルを変更することのもう 1 つの欠点は、プロパティが舞台裏で変更されているため、XAML だけを読み取って UI の動作を理解することが非常に難しくなることです。WPF には、このアプローチよりも優先される方法が多数組み込まれています。代替の実装に興味がある場合は、私たちがお手伝いします:)

そうは言っても、このアプローチを使用する必要がある場合、添付された動作は次のようになります。

C#

public static class FontWeightFocusedHelper
{
    private static readonly List<Label> Labels = new List<Label>();

    public static void SetChangeFontWeightOnTextBoxFocused(Label label, bool value)
    {
        label.SetValue(ChangeFontWeightOnTextBoxFocusedProperty, value);
    }

    public static bool GetChangeFontWeightOnTextBoxFocused(Label label)
    {
        return (bool) label.GetValue(ChangeFontWeightOnTextBoxFocusedProperty);
    }

    public static readonly DependencyProperty ChangeFontWeightOnTextBoxFocusedProperty =
        DependencyProperty.RegisterAttached("ChangeFontWeightOnTextBoxFocused", typeof (bool),
                                            typeof (FontWeightFocusedHelper),
                                            new FrameworkPropertyMetadata(OnChangeFontWeightOnTextBoxFocusedPropertyChanged));

    private static void OnChangeFontWeightOnTextBoxFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is TextBox)
        {
            var textBox = (TextBox) d;
            // Make sure to use a WeakEventManager here otherwise you will leak ...
            textBox.GotFocus += OnTextBoxGotFocusChanged;
            textBox.LostFocus += OnTextBoxLostFocusChanged;
            return;
        }

        if (d is Label)
        {
            // Make sure to store WeakReferences here otherwise you will leak ...
            Labels.Add((Label)d);
            return;
        }

        throw new InvalidOperationException("ChangeFontWeightOnTextBoxFocused can only be set on TextBox and Label types.");
    }

    private static void OnTextBoxLostFocusChanged(object sender, RoutedEventArgs e)
    {
        SetMatchingLabelFontWeight(sender as TextBox, FontWeights.Regular);
    }

    private static void OnTextBoxGotFocusChanged(object sender, RoutedEventArgs e)
    {
        SetMatchingLabelFontWeight(sender as TextBox, FontWeights.Bold);
    }

    private static void SetMatchingLabelFontWeight(TextBox textBox, FontWeight fontWeight)
    {
        if (textBox != null)
        {
            // Suggest adding a property for LabelPrefix and TextBoxPrefix too, use them here
            var label = Labels.Where(l => !String.IsNullOrEmpty(l.Name))
                              .Where(l => l.Name.Replace("lbl", "txt") == textBox.Name)
                              .FirstOrDefault();

            if (label != null)
            {
                label.FontWeight = fontWeight;
            }
        }
    }
}

XAML

    <StackPanel >
        <StackPanel.Resources>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="l:FontWeightFocusedHelper.ChangeFontWeightOnTextBoxFocused" Value="True" />
            </Style>
            <Style TargetType="{x:Type Label}">
                <Setter Property="l:FontWeightFocusedHelper.ChangeFontWeightOnTextBoxFocused" Value="True" />
            </Style>
        </StackPanel.Resources>
        <StackPanel Orientation="Horizontal">                
            <Label x:Name="lblOne" VerticalAlignment="Center" Content="First Name"/>
            <TextBox x:Name="txtOne" Width="300" VerticalAlignment="Center"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label x:Name="lblTwo" VerticalAlignment="Center" Content="Last Name" />
            <TextBox x:Name="txtTwo" Width="300" VerticalAlignment="Center" />
        </StackPanel>
    </StackPanel>

お役に立てれば!

于 2011-12-18T14:40:39.693 に答える