首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在样式中定义InputBindings

在样式中定义InputBindings
EN

Stack Overflow用户
提问于 2010-04-18 09:37:22
回答 2查看 13.3K关注 0票数 23

我正在使用MVVM设计模式创建一个WPF应用程序,并尝试扩展TabItem控件,以便在用户单击鼠标中键时关闭选项卡。我正在尝试使用InputBindings来实现这一点,在我尝试在样式中定义它之前,它工作得非常好。我了解到,除非使用DependencyProperty附加样式,否则无法将InputBindings添加到样式。所以我关注了这个类似的帖子here...,它起作用了……差不多了。我可以使用鼠标中键关闭一个选项卡,但它不会在其他任何选项卡上工作(所有选项卡都是在运行时添加的,并继承相同的样式)。

所以我需要一些帮助。为什么这只在第一次起作用,而不是在之后呢?显然,我可以创建一个从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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-19 09:49:36

不要紧,我自己想出来的。我甚至没有使用上面的Attach类。取而代之的是,我在ControlTemplate上对TabItem (这是一个边框)使用了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>
票数 16
EN

Stack Overflow用户

发布于 2011-10-18 22:33:47

你的类"Attach“对我来说工作得很好!如果有人需要,诀窍是使用这样的样式,带有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>

谢谢!

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2660760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档