13

確かに最も一般的なWPF要件の1つでなければならないことに困惑しています。この質問を読みましたが、ソリューションの実装が機能しません。

ルックレスコントロールのマークアップは次のとおりです。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:WpfTest">
  <Style TargetType="{x:Type local:CustomControl}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:CustomControl}">
          <Border>
            <TextBox x:Name="myTextBox" />
          </Border>
          <ControlTemplate.Triggers>
            <Trigger Property="IsFocused"
                     Value="True">
              <Setter Property="FocusManager.FocusedElement"
                      Value="{Binding ElementName=myTextBox}" />
              <Setter TargetName="myTextBox"
                      Property="Background"
                      Value="Green" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>

CustomControlのインスタンスを含むウィンドウのマークアップは次のとおりです。

<Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest"
        Title="Window1" Height="300" Width="300">

  <local:CustomControl x:Name="CCtl" />
</Window>

そして、これがコードビハインドです:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Loaded += (RoutedEventHandler)delegate { CCtl.Focus(); };
    }
}

Window1がロードされると、テキストボックスは緑色に変わります(トリガーが機能することを示します)が、フォーカスはテキストボックスではなくCCtlに残ります。間違いなく、これは次のデータエラーを表示する出力と関係があります。

参照'ElementName=myTextBox'とのバインディングのソースが見つかりません。BindingExpression :(パスなし); DataItem = null; ターゲット要素は'CustomControl'(Name ='CCtl'); ターゲットプロパティは「FocusedElement」(タイプ「IInputElement」)です。

このエラーが表示される理由がわかりません。感謝の気持ちを込めて受け取ったポインタ。

4

2 に答える 2

14

代わりに、これをトリガーに使用してみてください。

<Trigger Property="IsFocused" Value="True">
    <Setter TargetName="myTextBox" Property="FocusManager.FocusedElement" Value="{Binding ElementName=myTextBox}" />
</Trigger>

エラーは、名前がFocusedElementプロパティが適用されているスコープにないため、myTextBoxを見つけることができないことを示しています。この場合、それはCCtlインスタンス自体にあり、独自のテンプレート内を見ることができません。テンプレート内の何かにプロパティを設定することにより、Bindingは名前付き要素を見つけることができます。

于 2010-12-01T13:58:10.773 に答える
0

私は間違っているかもしれませんが、あなたの問題はあなたの財産の引き金にあると思います。

フォーカスされるように設定すると、テンプレート化された親TextBoxのが無効にTriggerなり、トリガーが巻き戻されて、テキストボックスにフォーカスの設定が逆になります(したがって、フォーカスが解除されます)。

于 2010-12-01T11:59:09.337 に答える