gpt4 book ai didi

wpf - 将行为绑定(bind)附加到 controltemplate 中的元素

转载 作者:行者123 更新时间:2023-12-01 07:30:27 24 4
gpt4 key购买 nike

我正在向 slider 添加附加行为,当拇指被拖动并保持在特定区域上时,这将导致它滚动一些内容。 (不能使用简单的 IsMouseOver 触发器,因为 Slider Thumb 具有 MouseCapture。)

该行为具有 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

当用户拖动 slider 时,IsScrollHoverProperty 被设置为 true,这一切都在 Slider 的 ControlTemplates.Triggers 中完成,并且可以正常工作。

当它设置为 true 时,回调会将 PreviewMouseEnterHandlers 挂接到两个 Rectangle 中,以检测鼠标何时进入它们。

因此,有问题的矩形也在 Slider 的 controltemplate 中定义:
        <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>

我遇到的问题是将这些矩形绑定(bind)到附加的 ScrollRightRect 和 ScrollLeftRect 属性。我尝试了一些事情,并怀疑我犯了一个愚蠢的绑定(bind)错误,或者正在尝试做一些不允许的事情。我目前将它们绑定(bind)在 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>

我知道这个触发器正在被触发,因为矩形按预期填充红色。
谁能从这些片段中发现我做错了什么?

提前致谢。

最佳答案

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

<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>

当我将鼠标悬停在按钮上时,此代码段应导致“Hello”出现两次,但事实并非如此,并且我得到与您相同的错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=theText'. BindingExpression:Path=Text; DataItem=null; target element is 'Button' (Name=''); target property is 'Content' (type 'Object')



这是可以解释的 - 一旦绑定(bind)设置在 Button ,它将无法找到名为“theText”的控件,因为 Button 位于不同的 NameScope 中.

替代

某些 WPF 控件需要执行与您类似的操作 - 它们假定树中存在与它们交互的特定控件。但他们不使用属性——他们使用名称。

首先为控件命名 - 约定是使用“PART_”前缀:
<Rectangle ... Name="PART_ScrollLeftRect" />

现在在 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属性已设置,模板可能尚未准备好。在这种情况下,您可能想要订阅 Loaded或类似事件,然后调用 ApplyTemplate() .

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

PART_ 前缀的使用是 WPF 约定,通常与 TemplatePart 一起使用。属性。 TextBox 就是一个例子。当您覆盖 TextBox 的模板时, it won't function until you add a control named PART_ContentHost .

更新:我刚刚在这里写了关于模板部分的博客:http://www.paulstovell.com/wpf-part-names

关于wpf - 将行为绑定(bind)附加到 controltemplate 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com