gpt4 book ai didi

c# - 如何在 app.xaml [C#] 中全局设置文本框的属性

转载 作者:行者123 更新时间:2023-11-30 20:36:29 25 4
gpt4 key购买 nike

我正在写一个应用程序,我有所有的逻辑,但是从前端的角度来看,我不太熟悉一些工作。

我已经学会了如何设置所有按钮的全局设计。与我尝试做文本框的方式相同。确实应用了样式,但在应用此样式后我无法将任何文本插入文本框......我该如何解决?问题是什么 ?有人可以告诉我哪里出了问题吗?

我想做的只是在有人将鼠标悬停在所有文本框和按钮上时在所有文本框和按钮周围制作红色细边框。还有一个组合框,我也想以相同的样式提供。

这是我在 App.xaml 中的代码:

<Application x:Class="Application.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Application"
StartupUri="MainWindow.xaml">
<Application.Resources>

<Style TargetType="Button">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="border"
CornerRadius="2"
BorderThickness="2"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="#FF0000" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

<Style TargetType="TextBox">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<!--<Setter Property="Foreground" Value="#000000"/>-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Name="textbox"
CornerRadius="2"
BorderThickness="2"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="textbox" Property="BorderBrush" Value="#FF0000" />
<!--<Setter Property="Foreground" Value="#FF0000"/>-->
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</Application.Resources>
</Application>

编辑:顺便说一句,按钮工作正常

!!!编辑 2:

我试图在我的路上修复组合框,但是与 ControlTemplate 的任何组合都没有 ScrollViewer 成功。这是我的应用程序中唯一缺少的一个组件。我已经阅读并尝试了许多类似这样的解决方案,例如:How to style ComboBox Background on Mouse Hover?

正因为如此,我想请教解决方案。对 xaml 更复杂部分的整体理解与我只关注组合框的一个突出部分无关,因为我专注于编程的逻辑部分。我想要一个组合框,它在鼠标悬停时更改颜色边框为红色,组合框的其余部分应保持标准。只有这一个属性。我怎样才能快速改变它?

最佳答案

TextBox 需要名称为“PART_ContentHost”的控件,它可以在其中放置内容。实际上,在 TextBox 的默认模板中,ScrollViewer 用于此,因此一种解决方法是将您的 ContentPresenter 替换为:

<ScrollViewer x:Name="PART_ContentHost" />

或者,您可以使用 Border 作为内容宿主:

<ControlTemplate TargetType="TextBox">
<Border CornerRadius="2"
BorderThickness="2"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
x:Name="PART_ContentHost" />
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="PART_ContentHost"
Property="BorderBrush"
Value="#FF0000" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

更新:为什么是 PART_ContentHost?假设您是某个控件的作者。您尝试设计您的控件,以便它可以与其他人提供的任何 ControlTemplate 一起工作。但这并不总是可能的,有时您需要模板的特定部分来匹配特定条件。在这种情况下,TextBox 的作者在其模板中找到一个控件,它是 ScrollViewer 或 Decorator,并且名称为“PART_ContentHost”。他后来对该控件所做的操作与我们无关:TextBox 只需要名称为“PART_ContentHost”的控件位于模板中即可正常运行。控件的作者如何表达这样的要求?通过TemplatePart属性。该属性除了表达上述要求外什么都不做。如果您查看 TextBox 继承的 TextBoxBase 控件,您将看到:

[TemplatePart(Name = "PART_ContentHost", Type = typeof (FrameworkElement))]

关于c# - 如何在 app.xaml [C#] 中全局设置文本框的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36875480/

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