0

私はそのトピックについてよく検索しましたが、コードビハインドを使用せずにこれに対する解決策を実際に見つけることができませんでした。このビューに関連するものにコードビハインドを使用することはまったく問題ないと言う人もいると思いますが、それでも避けたいと思います。

単一のテキストボックスと[OK]ボタンを備えた「ダイアログ」を表示するユーザーコントロールがあります。そのダイアログは、他のすべての上に配置される単純なユーザーコントロールです。デフォルトでは、ユーザーコントロールの可視性は折りたたまれているように設定されています。ユーザーコントロールが表示される場合、ダイアログユーザーコントロールのテキストボックスにキーボードフォーカスを設定したいと思います。これをxamlで完全に行う方法はありますか? コントロールがロードされた時点でダイアログコントロールが表示されないため、設定するだけです

FocusManager.FocusedElement="{Binding ElementName=tbID}"

動作しないでしょう。ある種の可視性トリガーを使用しようとしました:

   <TextBox Grid.Column="3"
             Grid.Row="5"
             Name="tbID"
             VerticalAlignment="Center">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Visibility" Value="Visible">
                        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=tbID}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

しかし、これもうまくいきません。トリガーは起動されますが、テキストボックスはフォーカスを取得しません。私はそれについて何か提案をいただければ幸いです。前もって感謝します!

4

2 に答える 2

3

添付された動作を使用してフォーカスを設定することができます。サンプルコードは次のとおりです。

public static class Focus
{
    public static readonly DependencyProperty ShouldFocusWhenVisibleProperty =
        DependencyProperty.RegisterAttached("ShouldFocusWhenVisible", typeof (bool), typeof (Focus), new PropertyMetadata(default(bool), ShouldFocusWhenVisibleChanged));

    private static void ShouldFocusWhenVisibleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = sender as UIElement;
        if (uiElement == null) return;

        var shouldFocus = GetShouldFocusWhenVisible(uiElement);
        if (shouldFocus)
        {
            UpdateFocus(uiElement);
            uiElement.IsVisibleChanged += UiElementOnIsVisibleChanged;
        }
        else
            uiElement.IsVisibleChanged -= UiElementOnIsVisibleChanged;
    }

    private static void UiElementOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = sender as UIElement;
        if (uiElement == null) return;

        UpdateFocus(uiElement);
    }

    private static void UpdateFocus(UIElement uiElement)
    {
        if (!uiElement.IsVisible) return;

        Keyboard.PrimaryDevice.Focus(uiElement);
    }

    public static void SetShouldFocusWhenVisible(UIElement uiElement, bool value)
    {
        uiElement.SetValue(ShouldFocusWhenVisibleProperty, value);
    }

    public static bool GetShouldFocusWhenVisible(UIElement uiElement)
    {
        return (bool)uiElement.GetValue(ShouldFocusWhenVisibleProperty);
    }
}

次に、ダイアログの TextBox に次のコードを適用します<TextBox local:Focus.ShouldFocusWhenVisible="True" />local:上記の Focus クラスの名前空間への参照である必要があることに注意してください。

于 2013-03-04T13:35:23.940 に答える
2

UserControl Visibility私はあなたがプロパティではなくプロパティにバインドしたいと思いますTextBox

<UserControl x:Class="WpfApplication7.IconButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="200" Name="_this">
    <Grid>
        <TextBox Name="tbID" Margin="0,12,0,0" VerticalAlignment="Top">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=_this, Path=Visibility}" Value="Visible">
                            <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=tbID}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </Grid>
</UserControl>
于 2013-03-04T22:16:04.470 に答える