相对于源的控件的 WPF 内容

Posted

技术标签:

【中文标题】相对于源的控件的 WPF 内容【英文标题】:WPF Content of Control relative to source 【发布时间】:2022-01-03 18:00:28 【问题描述】:

我有以下代码用于自定义 WPF 单选按钮,其中包含图像作为内容。 图像构建操作设置为“内容”,复制到输出目录设置为“如果较新则复制”。

<!--MaterialButtonTheme-->
    <Style BasedOn="StaticResource x:Type ToggleButton"
       TargetType="x:Type RadioButton"
       x:Key="MaterialButtonTheme">
        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="RadioButton">
                        <Grid   VerticalAlignment="Stretch"
                                HorizontalAlignment="Stretch"
                                Background="TemplateBinding Background">
                            <Border>
                                <Image Source="Binding Path=Content, RelativeSource=RelativeSource TemplatedParent"/>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Opacity" Value=".3"/>
            <Setter Property="BorderThickness" Value="0"/>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Opacity" Value=".8"/>
            </Trigger>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Opacity" Value=".6"/>
            </Trigger>
        </Style.Triggers>
    </Style>

现在,我不想对图像资源使用硬代码变体,但以下方法不起作用。

<RadioButton
                         x:Name="RadioButtonSteelMat"
                         Height="30" Width="30"
                         Foreground="White"
                         HorizontalAlignment="Left"
                         FontSize="14"
                         Style="StaticResource MaterialButtonTheme"
                         Content="../EmbeddedResources/Images/steel.png"
                         IsChecked="False"
                         Margin="10,200,0,0" 
                         Checked="RadioButtonSteelMat_Checked"
                />

以下硬编码变体可以正常工作。有人知道我做错了什么吗?

<RadioButton
                         x:Name="RadioButtonSteelMat"
                         Height="30" Width="30"
                         Foreground="White"
                         HorizontalAlignment="Left"
                         FontSize="14"
                         Style="StaticResource MaterialButtonTheme"
                         Content="C:\Users\Niklas\Desktop\Studium\Master\M4\Thesis\Tool\OptioneeringTool\OptioneeringTool\B+GOpt\EmbeddedResources\Images\steel.png"
                         IsChecked="False"
                         Margin="10,200,0,0" 
                         Checked="RadioButtonSteelMat_Checked"
                />

【问题讨论】:

在 WPF 应用程序中,您通常会将图像文件的 Build Action 设置为 Resource 并通过 Resource File Pack URI 加载它,例如"pack://application:,,,/EmbeddedResources/Images/steel.png"。您可能必须使用 XAML 元素语法来设置内容:&lt;RadioButton ...&gt;&lt;BitmapImage UriSource="pack://application:,,,/EmbeddedResources/Images/steel.png"/&gt;&lt;/RadioButton&gt; 真的必须是png吗?我更喜欢一条路。或者如果它绝对必须是多种颜色,则可以使用绘图视觉。材料设计是扁平的,所以我本来希望有一条可行的路径。 如果您不想将图像作为资源嵌入,您可以使用siteoforigin 而不是application pack uri。 "pack://siteoforigin:,,,/EmbeddedResources/Images/steel.png"docs.microsoft.com/en-us/dotnet/desktop/wpf/app-development/… 【参考方案1】:

Content="/EmbeddedResources/Images/steel.png" 应该可以工作,假设 EmbeddedResources 文件夹位于您构建时 Visual Studio 中的项目文件夹的根目录,并且图像文件的 Built Action 设置为“内容”,Copy to Output Directory 属性设置为“如果较新,请复制”。

另一个选项是将Built Action 设置为“资源”并使用pack URI 来引用它:

pack://application:,,,/EmbeddedResources/Images/steel.png

【讨论】:

以上是关于相对于源的控件的 WPF 内容的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 设置相对于用户控件的对话框窗口位置

如何相对缩放用户控件的大小?

在 WPF 中相对于其容器绘制对角文本/文本块/标签/控件

WPF获取相对位置坐标的方法

如何在 UWP 中进行相对源模式查找祖先(或等价物)

wpf image控件 绑定本地磁盘的图片 绝对路径的应该怎么写