Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
C# 绑定到通用UI元素/XAML接口_C#_Wpf_Xaml_Generics_Binding - Fatal编程技术网

C# 绑定到通用UI元素/XAML接口

C# 绑定到通用UI元素/XAML接口,c#,wpf,xaml,generics,binding,C#,Wpf,Xaml,Generics,Binding,我有一个DrawingImage用作矢量图像占位符。 此外,还有一些样式采用相应的DrawingImage并将其用作my UserControl自定义按钮中的图像 到目前为止,一切都很好,但我刚刚意识到我当前的方法导致DrawingImages不可重用,因为它们的笔刷属性很难绑定到控件,它们在中使用,如下所示: <DrawingImage x:Key="addIcon"> <DrawingImage.Drawing> <Dra

我有一个DrawingImage用作矢量图像占位符。 此外,还有一些样式采用相应的DrawingImage并将其用作my UserControl自定义按钮中的图像

到目前为止,一切都很好,但我刚刚意识到我当前的方法导致DrawingImages不可重用,因为它们的笔刷属性很难绑定到控件,它们在中使用,如下所示:

<DrawingImage x:Key="addIcon">
        <DrawingImage.Drawing>
            <DrawingGroup>
                <GeometryDrawing Brush="{Binding Path=ImageBrush, ElementName=addButton}" Geometry="M438.2,0H51.6C23.1,0,0,23.2,0,51.6v386.6c0,28.5,23.2,51.6,51.6,51.6h386.6c28.5,0,51.6-23.2,51.6-51.6V51.6
                    C489.8,23.2,466.6,0,438.2,0z M465.3,438.2c0,14.9-12.2,27.1-27.1,27.1H51.6c-14.9,0-27.1-12.2-27.1-27.1V51.6
                    c0-14.9,12.2-27.1,27.1-27.1h386.6c14.9,0,27.1,12.2,27.1,27.1V438.2z" />
                <GeometryDrawing Brush="{Binding Path=ImageBrush, ElementName=addButton}" Geometry="M337.4,232.7h-80.3v-80.3c0-6.8-5.5-12.3-12.3-12.3s-12.3,5.5-12.3,12.3v80.3h-80.3c-6.8,0-12.3,5.5-12.3,12.2
                    c0,6.8,5.5,12.3,12.3,12.3h80.3v80.3c0,6.8,5.5,12.3,12.3,12.3s12.3-5.5,12.3-12.3v-80.3h80.3c6.8,0,12.3-5.5,12.3-12.3
                    C349.7,238.1,344.2,232.7,337.4,232.7z" />
            </DrawingGroup>
        </DrawingImage.Drawing>
    </DrawingImage>

现在,我试图找到一种方法,使它们不直接绑定到元素,而是绑定到某种通用元素(与接口工作类似),这样代码就可以确保绑定到它的任何东西都具有笔刷依赖属性。

到目前为止,我没有找到它

我也尝试过通过搜索祖先,但仍然没有运气

绑定到具有某些依赖属性的未知元素而不直接公开它们,是否有一种或多或少的常见做法


事实上,没有办法直接按照你的要求去做。原因是,当您将
DrawingImage
定义为一个资源,然后将其用作图像的源时,不会创建该资源的副本,而是每个图像都会查看相同的资源。因此,
DrawingImage
在可视树中根本不能有父级,因此没有要绑定的控件

这里有两种选择。一种是将
几何体
用作资源,而不是
绘图图像
。然后,您可以创建一些参考此
几何体并使用不同颜色的
DrawingImage
资源。或者根本不使用
DrawingImage
,而是直接使用几何体(例如,通过
路径
)。实际上,有很多方法可以使用和组合几何体资源。我在此仅举几个例子:

<Window x:Class="FlipControlApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow" Height="300" Width="300">
    <Window.Resources>
        <PathGeometry x:Key="addIconGeometry" Figures="M337.4,232.7h-80.3v-80.3c0-6.8-5.5-12.3-12.3-12.3s-12.3,5.5-12.3,12.3v80.3h-80.3c-6.8,0-12.3,5.5-12.3,12.2
                c0,6.8,5.5,12.3,12.3,12.3h80.3v80.3c0,6.8,5.5,12.3,12.3,12.3s12.3-5.5,12.3-12.3v-80.3h80.3c6.8,0,12.3-5.5,12.3-12.3
                C349.7,238.1,344.2,232.7,337.4,232.7z"/>

        <PathGeometry x:Key="iconBorderGeometry" Figures="M438.2,0H51.6C23.1,0,0,23.2,0,51.6v386.6c0,28.5,23.2,51.6,51.6,51.6h386.6c28.5,0,51.6-23.2,51.6-51.6V51.6
                C489.8,23.2,466.6,0,438.2,0z M465.3,438.2c0,14.9-12.2,27.1-27.1,27.1H51.6c-14.9,0-27.1-12.2-27.1-27.1V51.6
                c0-14.9,12.2-27.1,27.1-27.1h386.6c14.9,0,27.1,12.2,27.1,27.1V438.2z"/>

        <GeometryGroup x:Key="addIconWithBorderGeometry">
            <StaticResource ResourceKey="iconBorderGeometry"/>
            <StaticResource ResourceKey="addIconGeometry"/>
        </GeometryGroup>

        <DrawingImage x:Key="addIconBlack">
            <DrawingImage.Drawing>
                <DrawingGroup>
                    <GeometryDrawing Brush="Black" Geometry="{StaticResource addIconWithBorderGeometry}" />
                </DrawingGroup>
            </DrawingImage.Drawing>
        </DrawingImage>
    </Window.Resources>

    <UniformGrid Columns="2">
        <Button Name="addButton0" Width="100" Height="100">
            <Image Source="{StaticResource addIconBlack}"/>
        </Button>

        <Button Width="100" Height="100" Foreground="Blue">
            <Image>
                <Image.Source>
                    <DrawingImage>
                        <DrawingImage.Drawing>
                            <DrawingGroup>
                                <GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Control}}"
                                                 Geometry="{StaticResource addIconGeometry}" />
                            </DrawingGroup>
                        </DrawingImage.Drawing>
                    </DrawingImage>
                </Image.Source>
            </Image>
        </Button>

        <Button Width="100" Height="100" Foreground="Green">
            <Grid>
                <Path Data="{StaticResource iconBorderGeometry}" Fill="Pink" Stretch="Uniform"/>
                <Path Data="{StaticResource addIconGeometry}" Fill="Purple" Stretch="Uniform" Margin="15"/>
            </Grid>
        </Button>

        <Button x:Name="addBtn" Width="100" Height="100" Foreground="Green">
            <Path Fill="{Binding Foreground, ElementName=addBtn}" Stretch="Uniform">
                <Path.Data>
                    <CombinedGeometry Geometry1="{StaticResource iconBorderGeometry}" Geometry2="{StaticResource addIconGeometry}"/>
                </Path.Data>
            </Path>
        </Button>
    </UniformGrid>
</Window>
然后使用它:

<Button Name="addButton3" Width="100" Height="100"
        Content="{StaticResource addIconImage}" Foreground="Red"/>
<Button Name="addButton4" Width="100" Height="100"
        Content="{StaticResource addIconImage}" Foreground="Green"/>

每次引用它时,都将创建新副本


但是第一种方法更灵活。

谢谢您的深入解释。如果您可以为第二部分添加示例,我将非常感谢!这解释了很多。再次感谢你
<Button Name="addButton3" Width="100" Height="100"
        Content="{StaticResource addIconImage}" Foreground="Red"/>
<Button Name="addButton4" Width="100" Height="100"
        Content="{StaticResource addIconImage}" Foreground="Green"/>