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标记是值得怀疑的。