gpt4 book ai didi

c# - 如何创建 WPF 控件模板?

转载 作者:太空狗 更新时间:2023-10-29 20:01:21 25 4
gpt4 key购买 nike

我正在尝试创建 linkbutttonlike,就像在此处的回答中所说:How do I make a WPF button look like a link?

  1. 我创建了 UserControl,默认的 xaml 看起来像这样:
<UserControl x:Class="Wpf.Controls.HyperlinkLikeButtonTemplate"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>

</Grid>
</UserControl>
  1. 我将 ControlTemplate 放在了里面:

         <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
    <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
    <ContentPresenter />
    </TextBlock>
    <ControlTemplate.Triggers>
    <Trigger Property="Button.IsMouseOver" Value="true">
    <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
    </Trigger>
    </ControlTemplate.Triggers>
    </ControlTemplate>

    <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
    <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
    </Style>

但是我得到了错误

The property "Content" can only be set once.

我做错了什么?

最佳答案

您不能在您的用户控件中定义样式或模板,您必须定义它的资源。此外,大多数控件只能有一个内容。您的 UserControl 的 Content 是一个 ControlTemplate 和一个 Style,这是不允许的,因为解释器不知道可以将哪一个分配为内容。

尝试添加<UserControl.Resources>标签。

编辑:此外,您的 UserControl 中没有控件,您应该将其拆分为资源(样式、模板等)和控件。您已经为按钮定义了样式。但是目前没有按钮(这就是默认模板中有 Grid 的原因)。

<UserControl x:Class="Wpf.Controls.HyperlinkLikeButtonTemplate"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<!-- Resources of your control, dictionaries, styles, etc. -->
<UserControl.Resources>
<ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
<TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
<ContentPresenter />
</TextBlock>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
<Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

<Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
<Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
</Style>
</UserControl.Resources>

<!-- Controls that are in your UserControl -->
<Button Style="{StaticResource HyperlinkLikeButton}"/>
</UserControl>

从技术上讲,您不需要自己的用户控件。您可以在 ResourceDictionary 中使用您的模板和样式,并将样式指定为资源以使用 HyperlinkBut​​ton。

关于c# - 如何创建 WPF 控件模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750120/

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