Wpf 自定义控件模板绑定问题
想象一下,一个具有网格覆盖的表单设计器将表示平面上的坐标。我试图将网格覆盖的属性绑定到自定义Wpf 自定义控件模板绑定问题,wpf,binding,custom-controls,Wpf,Binding,Custom Controls,想象一下,一个具有网格覆盖的表单设计器将表示平面上的坐标。我试图将网格覆盖的属性绑定到自定义ItemsControl中的Canvas 网格是使用可视化笔刷创建的。VisualBrush的Viewbox和Viewport绑定到代码中的Rect,以及用于显示网格平铺的矩形的高度和宽度。但是,当控件显示时,网格平铺似乎“无限小”(网格只是灰色的),因为如果我放大网格,程序最终会卡住,无法渲染它。显然,这不是我想要的效果 <Style TargetType="{x:Type Controls:Fo
ItemsControl
中的Canvas
网格是使用可视化笔刷创建的。VisualBrush
的Viewbox
和Viewport
绑定到代码中的Rect
,以及用于显示网格平铺的矩形的高度和宽度。但是,当控件显示时,网格平铺似乎“无限小”(网格只是灰色的),因为如果我放大网格,程序最终会卡住,无法渲染它。显然,这不是我想要的效果
<Style TargetType="{x:Type Controls:FormControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Controls:FormControl}">
<Border Background="White"
BorderBrush="Black"
BorderThickness="1"
Padding="49">
<Grid Height="{TemplateBinding CanvasHeight}"
Width="{TemplateBinding CanvasWidth}">
<Grid.Background>
<!--"0,0,6,11.3266666666667"-->
<VisualBrush TileMode="Tile"
Viewbox="{TemplateBinding GridUnitViewbox}"
ViewboxUnits="Absolute"
Viewport="{TemplateBinding GridUnitViewbox}"
ViewportUnits="Absolute">
<VisualBrush.Visual>
<Rectangle Height="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox.Height}"
HorizontalAlignment="Left"
Opacity="{TemplateBinding GridOpacity}"
Stroke="Black"
StrokeThickness=".1"
VerticalAlignment="Top"
Width="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox.Width}" />
</VisualBrush.Visual>
</VisualBrush>
</Grid.Background>
<ItemsPresenter />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="Controls:FormControlItem">
<Setter Property="Canvas.Left"
Value="{Binding Path=X}" />
<Setter Property="Canvas.Top"
Value="{Binding Path=Y}" />
</Style>
</Setter.Value>
</Setter>
</Style>
网格
控件实际上正在执行我希望它执行的操作。其中的VisualBrush
和矩形
未正确绑定或未正确更新。
正下方的注释是硬编码的测试值,在我开始绑定值之前,我正在使用该值对VisualBrush
的Viewbox
和Viewport
以及矩形
的尺寸进行测试,它在视觉上产生了我想要的效果。我还确认了6和11.32667实际上是运行时GridUnitViewbox
维度的值
我有一种感觉,绑定正在生成'0,0,0,0',然而,因为网格覆盖只是一个灰色阴影,正在消耗大量的资源;事实上,如果放大程序,会锁定它。正如您所看到的,在代码中,我尝试将AffectsMeasure
和AffectsParentMeasure
添加到dependency属性的元数据选项中,希望在GridUnitViewbox
的维度更新后UI没有正确更新,但我错了。我不确定还能是什么。什么是画布宽度和画布高度?它们有定义吗
此外,我认为画布没有大小,除非明确指定。绑定到它时,宽度/高度可能为零
在渲染过程后,尝试使用ActualWidth和ActualHeight或画布,查看它们是否包含任何值,但如果不提供值,请确认它们不包含任何值。什么是CanvasWidth和CanvasHeight?它们有定义吗
此外,我认为画布没有大小,除非明确指定。绑定到它时,宽度/高度可能为零
在渲染过程结束后,请尝试使用ActualWidth和ActualHeight或画布,查看它们是否包含任何值,但如果您不提供值,则它们不会包含任何值。好的,为了防止其他人遇到类似问题,我找到了解决方法。显然,VisualBrush
对TemplateBinding
s有点挑剔。我调整了XAML,它解决了问题:
<VisualBrush TileMode="Tile"
Viewbox="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox}"
ViewboxUnits="Absolute"
Viewport="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox}"
ViewportUnits="Absolute">
这里是我获取信息的地方。好吧,为了防止其他人遇到类似问题,我找到了解决方法。显然,VisualBrush
对TemplateBinding
s有点挑剔。我调整了XAML,它解决了问题:
<VisualBrush TileMode="Tile"
Viewbox="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox}"
ViewboxUnits="Absolute"
Viewport="{Binding RelativeSource={RelativeSource TemplatedParent},Path=GridUnitViewbox}"
ViewportUnits="Absolute">
这里是我获取信息的地方。您需要更具体地分析您的问题。人们是否会花时间研究这一大块XAML标记是值得怀疑的。您需要更具体地分析您的问题。人们是否会花时间浏览这一大块XAML标记是值得怀疑的。