23

MVVMデザインパターンを使用してWPFアプリを作成しており、ユーザーがマウスの中ボタンをクリックしたときにタブが閉じるようにTabItemコントロールを拡張しようとしています。私はInputBindingsを使用してこれを達成しようとしていますが、スタイル内で定義しようとするまでは非常にうまく機能します。DependencyPropertyを使用してスタイルをアタッチしない限り、InputBindingsをスタイルに追加できないことを学びました。だから私はここでこの同様の投稿をたどりました...そしてそれはうまくいきます...ほとんど。マウスの中ボタンを使用して1つのタブを閉じることはできますが、他のタブでは機能しません(すべてのタブは実行時に追加され、同じスタイルを継承します)。

だから私はいくつかの助けが必要です。なぜこれが最初にのみ機能し、その後は機能しないのでしょうか?もちろん、TabItemから継承するカスタムコントロールを作成して機能させることもできますが、プロジェクトでこれが拡張されていることがわかるので、これを理解したいと思います。私はDependencyPropertiesの専門家ではないので、手伝ってください。ありがとう!

スタイル:

<Style TargetType="{x:Type TabItem}">
    <Setter Property="w:Attach.InputBindings">
        <Setter.Value>
            <InputBindingCollection>
                <MouseBinding MouseAction="MiddleClick" 
                              Command="{Binding CloseCommand}"/>
            </InputBindingCollection>
        </Setter.Value>
    </Setter>
    ...
</Style>

クラス

public class Attach
{
    public static readonly DependencyProperty InputBindingsProperty =
        DependencyProperty.RegisterAttached("InputBindings", typeof(InputBindingCollection), typeof(Attach),
        new FrameworkPropertyMetadata(new InputBindingCollection(),
        (sender, e) =>
        {
            var element = sender as UIElement;
            if (element == null) return;
            element.InputBindings.Clear();
            element.InputBindings.AddRange((InputBindingCollection)e.NewValue);
        }));

    public static InputBindingCollection GetInputBindings(UIElement element)
    {
        return (InputBindingCollection)element.GetValue(InputBindingsProperty);
    }

    public static void SetInputBindings(UIElement element, InputBindingCollection inputBindings)
    {
        element.SetValue(InputBindingsProperty, inputBindings);
    }
}
4

2 に答える 2

19

あなたのクラス「アタッチ」は私にとってうまくいきました!必要に応じて、x:Shared修飾子を使用して次のようなスタイルを使用するのがコツです。

<InputBindingCollection x:Key="inputCollection" x:Shared="False">
        <KeyBinding Key="Del" Command="{Binding DeleteItemCommand}"/>
</InputBindingCollection>

<Style TargetType="{x:Type TabItem}">
    <Setter Property="w:Attach.InputBindings" Value="{StaticResource inputCollection}" />
    ...
</Style>

ありがとう!

于 2011-10-18T14:33:47.243 に答える
16

気にしないで、私はそれを自分で理解しました。上記のAttachクラスを使用していませんでした...代わりに、TabItem(Border)のControlTemplateでInputBindingsを使用したため、次のようになりました...なぜ考えなかったのかわかりませんそもそもこれの..:)

<ControlTemplate TargetType="{x:Type TabItem}">
    <Grid SnapsToDevicePixels="true">
        <Border x:Name="Bd" ...>
            <DockPanel>
                ...
            </DockPanel>
            <Border.InputBindings>
                <MouseBinding MouseAction="MiddleClick"
                              Command="{Binding CloseCommand}"/>
            </Border.InputBindings>
        </Border>
    </Grid>
    ...
</ControlTemplate>
于 2010-04-19T01:49:35.817 に答える