- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我整晚都在为这个问题苦思冥想。我想要做的就是拥有一个内容控件,它可以根据 ViewModel 中的 bool 值在显示两个不同按钮之间切换。
基本上我有一个任务在后台运行,带有一个取消按钮。一旦你点击取消并且任务停止,取消按钮应该变成后退按钮。这是两个独立的按钮元素,而不只是更改单个按钮的属性。我正在使用 MahApps TransitioningContentControl,所以我希望能够使用转换。
如果这大部分都可以在 XAML 中完成,我会很惊讶。我真的不想为本应简单的事情添加一堆样板代码。
编辑:这是代码片段。没有太多,因为我只是删除了所有不起作用的东西。
<Controls:TransitioningContentControl x:Name="CancelBackButtonControl" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80">
<Canvas>
<Button x:Name="CancelButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Style="{DynamicResource MetroCircleButtonStyle}" Height="80" IsCancel="True" Content="{StaticResource appbar_close}" BorderBrush="Black" Command="{Binding CancelCommand}"/>
<Button x:Name="GoBackButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Style="{DynamicResource MetroCircleButtonStyle}" Height="80" IsCancel="True" Content="{StaticResource appbar_arrow_left}" BorderBrush="Black" Command="{Binding GoBackCommand}"/>
</Canvas>
</Controls:TransitioningContentControl>
最佳答案
有很多方法可以实现这一点(这就是 WPF 的优点);但是,在我个人看来,如果您只是使用派生自 ToggleButton
的控件,那么“违背原则”的工作就会减少。 ,例如 RadioButton
,特别是因为您希望它全部在 XAML 中完成。重要的是不要通过视觉来考虑任何控件,而要通过它们的功能来考虑。我用 RadioButton
做了一些不可思议的事情之前,所以这是我要展示的第一件事;但是,此答案的后半部分包含常规按钮方法。
以下是两种方法(RadioButton
和 Button
)的完整示例,完全在 XAML 中完成:
预览:
代码:
<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type RadioButton}" x:Key="FlatRadioButtonStyle">
<Setter Property="Width" Value="100"/>
<Setter Property="Background" Value="#FF346FD6"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Padding" Value="5,2,5,3"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RadioButton}">
<Border Background="{TemplateBinding Background}"
Width="{TemplateBinding Width}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}">
<ContentPresenter Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF6696E9"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<RadioButton x:Name="BackButton" Content="Back">
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource FlatRadioButtonStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=CancelButton}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
<RadioButton x:Name="CancelButton" Content="Cancel" IsChecked="True">
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource FlatRadioButtonStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=BackButton}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
</Grid>
</Window>
大部分资源样式代码是视觉样式和模板,专注于使单选按钮看起来像常规按钮,因此不是很重要。我们将关注的领域是 Triggers
.您会注意到,在资源样式中,我确保当 RadioButton
被检查,它崩溃了。但是,在每个按钮的本地样式中,我确保当另一个 RadioButton
被检查,它使当前 RadioButton
可见的。这必须以本地方式完成,因为我们需要传递 ElementName
进入Binding
.所以,当 RadioButton
被检查,它崩溃并使另一个RadioButton
可见的。您还会注意到,我选中了我希望默认隐藏的按钮。显然,您可以使用绑定(bind)将其连接起来。
类似的方法可以应用于常规按钮:
预览:
代码:
<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type Button}" x:Key="ToggleButtonStyle">
<Setter Property="Width" Value="100"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button x:Name="CancelButton" Content="Cancel">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ToggleButtonStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused, ElementName=BackButton}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
<Button x:Name="BackButton" Content="Back">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ToggleButtonStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused, ElementName=CancelButton}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Window>
在这里,而不是IsChecked
,我正在使用 IsFocused
.您可以通过使用 EventTrigger
来完成类似的事情。和 Click
事件...但是,还有更多工作要做。 IsPressed
可能看起来像一个很好的候选人,但问题是一旦你按下按钮,另一个几乎会立即出现,那个将有IsPressed
。设置为 true
几乎是瞬间。因此,您最终会遇到这种循环行为,似乎什么都没有发生。请注意,我使用 Grid
将这些按钮放在彼此的顶部,默认情况下我希望在顶部可见的按钮,这样我就不必担心默认可见性或焦点。但是,您可以使用任何其他面板,只需设置 Visibility
您要隐藏的按钮默认为 Collapsed
.
如果您不想使用多个控件(在本例中为两个按钮),您也可以设置 Content
基于条件的按钮属性 DataTrigger
显示不同的文本。您只需要确保处理 Command
适本地。
关于c# - ContentControl 在两个按钮之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685101/
在我们的 VSTO Word 2010 插件中,我们试图在给定的其他 ContentControl 之后插入一个 RichTextControl。我们试过这个: public ContentC
ContentControl.Template 和 ContentControl.ContentTemplate 有什么区别?我什么时候使用哪个? 例如,我可以在 WPF 的 xaml 文件中编写:
我有一个 ViewModel,它表示多个选项并实现 IDataErrorInfo。仅当至少选择了这些选项之一时,此 ViewModel 才有效。它绑定(bind)到 ContentControl。 D
我已经用这个把头撞在墙上有一段时间了。 我有一个从 ContentControl 派生的自定义控件 - 它完美地工作,除了它不会以声明方式或以编程方式调整大小以适应其父级。 自定义控件以(最终)内容呈
以下代码位于 MEF MVVM 桌面应用程序中。 Shell 已经构建,但正在初始化一个模块。 模块想要将文本添加到 Shell 中的 ContentControl,但以下代码不会导致在 Shell
我正在尝试创建自定义工具提示控件。该控件继承自ToolTip类。我的自定义工具提示将有一个标题和一个内容区域。内容可以是普通文本或任何其他内容(图像、richtextbox 等)。以下是自定义工具提示
我有一个自定义 WPF 控件。它有一个嵌套的 ContentControl,它绑定(bind)到模板的 Content 属性,因此它可以将任何对象设置为其内容。 如果内容是原始字符串,我想将以下样式应
我正在尝试构建一个控件,它根据传入的类型有选择地显示不同的内容,但由于某种原因,我最终什么也没显示。 我在这里缺少一些基本的东西吗? (此代码已从我的实际生产应用程序中大量剥离,但表现出相同的行为)
我有一个自定义 ContentControl,它具有固定的 XAML 布局,如 UserControl(而不是通常应用的通用模板)。 以前这个布局没有额外的标记,所以它的字面意思是: 这很好用。
我整晚都在为这个问题苦思冥想。我想要做的就是拥有一个内容控件,它可以根据 ViewModel 中的 bool 值在显示两个不同按钮之间切换。 基本上我有一个任务在后台运行,带有一个取消按钮。一旦你点击
我正在为 Word 2007 开发应用程序级加载项插件。不幸的是,我在设置动态添加的内容时遇到了一个小问题: 我已经创建了内容控件,并使用以下代码更改了它的样式: PlainTextContentCo
我最近偶然发现了以下问题:在我的 WPF 应用程序中,我实现了一个小设计器,您可以在其中将元素放在 Canvas 上,移动、缩放和旋转它们。 在网上搜索时,我找到了 following solutio
我正在尝试学习 MVVM,但遇到了一个奇怪的问题。我有一个带有抽屉控件的主菜单,它出现并显示一个菜单: 在这个抽屉所在的主窗口中,我有一个 ContentControl我在其中使用绑定(bind)设置
我正在尝试拥有一个绑定(bind)到 View 的 MainWindow。我在代码中更改了该 View 并希望它在主窗口中更新,但是这并没有发生。 我的 XAML 中有这段代码 然后我通
我试图创建一些图表图像,但从未在屏幕上显示这些图表。我已经在这方面工作了很长一段时间并尝试了很多不同的事情,但似乎没有任何效果。如果我首先在窗口中显示图表,则代码可以完美运行,但如果我不在窗口中显示它
谁能告诉我为什么这会使我的应用程序崩溃?我不知道为什么似乎有一些无休止的递归。我得到了这个异常(exception) Logical tree depth exceeded while travers
我不知道这里发生了什么。当我直接绑定(bind)到 TextBox 时,可以编辑值,但我想绑定(bind)到 ContentControl 中。 为什么 ContentControl 不更新 View
我想禁用我的一个元素的 EntrenceThemeAnimation。我有一个网格,将此动画设置为其所有子项(我认为这是页面的默认设置)。是否可以为该网格的子级 ContentControl 禁用此动
为什么我无法在设计时解析 ContentControl ContentTemplateSelector? (在运行时有效) Designer(VS2010)显示异常: System.Reflectio
我想创建内部有一个“子”控件的自定义 WPF 控件。子类化 ContentControl 或 UserControl 可行,但有一个缺陷:这些控件在设计器模式下不起作用。 “不起作用”是指这种情况:假
我是一名优秀的程序员,十分优秀!