Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 附加行为绑定到controltemplate中的元素_Wpf_Binding_Controltemplate_Attachedbehaviors - Fatal编程技术网

Wpf 附加行为绑定到controltemplate中的元素

Wpf 附加行为绑定到controltemplate中的元素,wpf,binding,controltemplate,attachedbehaviors,Wpf,Binding,Controltemplate,Attachedbehaviors,我添加了一个附加的行为到一个滑块,这将导致它滚动一些内容时,拇指是拖动和举行了一个特定的地区。(无法使用简单的IsMouseOver触发器,因为滑块拇指有鼠标座。) 该行为有3个属性: #region IsScrollHoverProperty public static readonly DependencyProperty IsScrollHoverProperty = DependencyProperty.RegisterAttached(

我添加了一个附加的行为到一个滑块,这将导致它滚动一些内容时,拇指是拖动和举行了一个特定的地区。(无法使用简单的IsMouseOver触发器,因为滑块拇指有鼠标座。)

该行为有3个属性:

    #region IsScrollHoverProperty
    public static readonly DependencyProperty IsScrollHoverProperty = DependencyProperty.RegisterAttached(
                                                "IsScrollHover",
                                                typeof(Boolean),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(false));
    #endregion

    #region ScrollLeftRectProperty
    public static readonly DependencyProperty ScrollLeftRectProperty = DependencyProperty.RegisterAttached(
                                                "ScrollLeftRect",
                                                typeof(Rectangle),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(null));
    #endregion

    #region ScrollRightRectProperty
    public static readonly DependencyProperty ScrollRightRectProperty = DependencyProperty.RegisterAttached(
                                                "ScrollRightRect",
                                                typeof(Rectangle),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(null));
    #endregion
当用户拖动滑块时,IsScrollHoverProperty被设置为true,这一切都是在滑块的ControlTemplates.Triggers中完成的,并且工作正常

当设置为true时,回调将把PreviewMouseEnterHandler挂接到两个矩形中,以检测鼠标何时进入它们

所讨论的矩形也在滑块的控制模板中定义,因此:

        <StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Left" Orientation="Horizontal">
            <Rectangle  Width="40" Fill="#AAAAAAAA" Name="ScrollLeftRect"/>

            </StackPanel>
        <StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Right" Orientation="Horizontal">
            <Rectangle  Width="40" Fill="#AAAAAAAA" Name="ScrollRightRect"/>
         </StackPanel>

我遇到的问题是将这些矩形绑定到附加的ScrollRightRect和ScrollLeftRect属性。我尝试了一些事情,怀疑我犯了一个愚蠢的绑定错误,或者正在尝试做一些不允许的事情。我目前正在controltemplate.triggers中绑定它们,如下所示:

        <Trigger Property="local:ScrollHoverAreaBehaviour.IsScrollHover" Value="False">

            <Setter Property="local:ScrollHoverAreaBehaviour.ScrollLeftRect" Value="{Binding ElementName=ScrollLeftRect}"/>
            <Setter Property="local:ScrollHoverAreaBehaviour.ScrollRightRect" Value="{Binding ElementName=ScrollRightRect}"/>

            <Setter TargetName="ScrollLeftRect" Property="Fill" Value="Red"/>
            <Setter TargetName="ScrollRightRect" Property="Fill" Value="Red"/>
        </Trigger>

我知道当矩形按预期填充红色时,该触发器将被触发。 有人能从这些片段中看出我做错了什么吗

提前谢谢


Rob

首先,让我们确认您没有做错任何事情,问题与附加的行为无关

<Button>
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Background="Yellow">
                <StackPanel>
                    <TextBlock x:Name="theText" Text="Hello" />
                    <ContentPresenter />
                </StackPanel>
            </Border>

            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Content" Value="{Binding ElementName=theText, Path=Text}" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>
现在,当设置了
IsScrollHover
时,在回调中放入如下代码:

private static void IsScrollHoverSetCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var target = (Slider) d;
    if ((bool)e.NewValue == false)
        return;

    target.ApplyTemplate();
    var leftRectangle = target.Template.FindName("PART_ScrollLeftRect", target);
    var rightRectangle = target.Template.FindName("PART_ScrollRightRect", target);

    // Do things with the rectangles
}
请注意,根据
IsScrollHost
属性的设置时间,模板可能尚未准备就绪。在这种情况下,您可能希望订阅加载的
或类似事件,然后调用
ApplyTemplate()

虽然它看起来更复杂,但它有一个很好的好处:标记将更简单。使用Blend的设计师不必记住连接那些复杂的触发器,他们只需正确命名控件即可

PART_uuu前缀的使用是WPF约定,通常与属性一起使用。文本框就是一个例子。覆盖
文本框的模板时,
部分内容主机


更新:我刚刚在这里写了一篇关于模板部分的博客:

您的ScrollLeftRect/ScrollRightRect从未设置过吗?OutputWindow中是否存在任何绑定错误?使用断点时,它们始终显示为null(默认值)。我得到以下绑定错误:System.Windows.Data错误:4:找不到引用为'ElementName=ScrollRightRect'的绑定源。BindingExpression:(无路径);DataItem=null;目标元素是“Slider”(Name='mainsloider');目标属性为“ScrollRightRect”(类型为“Rectangle”)。我相信这是一个直接的错误。但我已经看了很久了,就是看不出来。
private static void IsScrollHoverSetCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var target = (Slider) d;
    if ((bool)e.NewValue == false)
        return;

    target.ApplyTemplate();
    var leftRectangle = target.Template.FindName("PART_ScrollLeftRect", target);
    var rightRectangle = target.Template.FindName("PART_ScrollRightRect", target);

    // Do things with the rectangles
}