Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
我需要在 ImageBrush 上开始循环旋转,这是 Ellipse 控件的一种样式: 我需要在 ImageBrush 上开始循环旋转,这是一种椭圆控件的样式: <Ellipse x:Name="ellStatus" Width="14" Height="14" Stroke="#000000" Style="{StaticResource statusColorStyleEllipse}" /> 这就是风格: <Style x:Key="statusColorStyleEllipse" TargetType="{x:Type Ellipse}"> <Setter Property="Margin" Value="0,2" /> <Style.Triggers> <DataTrigger Binding="{Binding Stato}" Value="0"> <Setter Property="Fill" Value="{StaticResource statusTransparent}" /> </DataTrigger> <DataTrigger Binding="{Binding Stato}" Value="1"> <Setter Property="Fill" Value="{StaticResource statusYellow}" /> </DataTrigger> <DataTrigger Binding="{Binding Stato}" Value="2"> <Setter Property="Fill" Value="{StaticResource statusGreen}" /> </DataTrigger> <DataTrigger Binding="{Binding Stato}" Value="3"> <Setter Property="Fill" Value="{StaticResource statusAzur}" /> </DataTrigger> <DataTrigger Binding="{Binding Stato}" Value="4"> <Setter Property="Fill" Value="{StaticResource statusGray}" /> </DataTrigger> <DataTrigger Binding="{Binding MyProperty}" Value="0"> <Setter Property="Fill" Value="{StaticResource spinningIcon}" /> <Setter Property="Ellipse.Stroke" Value="Transparent" /> <Setter Property="Ellipse.StrokeThickness" Value="0" /> <Setter Property="Height" Value="25" /> <Setter Property="Height" Value="25" /> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="(Ellipse.RenderTransform).(RotateTransform.Angle)" From="0.0" To="360" Duration="0:0:10" /> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> </Style.Triggers> </Style> 这是“spinningIcon”控件: <ImageBrush x:Key="spinningIcon" ImageSource="pack://application:,,,/Component/Images/Icons/icon.png" RenderOptions.BitmapScalingMode="HighQuality" Stretch="Fill"/> 基本上,当“MyProperty”设置为零时,我可以正确地看到 png,但我想制作动画(360° 旋转)。我没有错误,但我的图像没有旋转。怎么了? 我尝试改变风格但没有效果 显然没有将 RotateTransform 应用于椭圆的 RenderTransform。 将这些 Setter 添加到样式中: <Style x:Key="statusColorStyleEllipse" TargetType="{x:Type Ellipse}"> <Setter Property="RenderTransform"> <Setter.Value> <RotateTransform/> </Setter.Value> </Setter> <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/> ... </Style> 您还会注意到椭圆的 Stroke 不会变得透明。这是因为您直接在椭圆上设置了 Stroke="#000000",它的优先级高于样式设置器中的值。将初始笔画分配也移至样式: <Setter Property="Stroke" Value="Black"/>
您好,我正在流畅的功能区中制作一个“编辑”选项卡,我希望它显示时的颜色有所不同。我目前让它像预期的那样显示和消失。但是,我不能...
WPF - UI 未更新,但 debug.writeline 正确更新
早上好,我一直在尝试为我的应用程序创建一个更新程序,并且几乎得到了最终结果,但是我似乎无法让 UI 报告我设置 Onpropertychanged 事件的进度...
Visual Studio 2022 发布/调试构建正常,发布期间出错
Visual Studio 2022 v17.8.6 在解决方案资源管理器中,我为我的 WPF 应用程序选择“发布”。在从 Net7 升级到 Net8 之前,FolderPublish 工作正常。升级项目后出现这些错误...
如何将 RadioButton Content 属性值绑定到样式中的 TextBlock 文本?
我在 WPF 上有这样的 RadioButton 样式 <Setter Property="Template"> <Setter.Val...</desc> <question vote="0"> <p>我在 WPF 上有这样的 RadioButton 样式</p> <pre><code><Style x:Key="UserRadioButton" TargetType="RadioButton"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="RadioButton"> <Grid> <Border x:Name="border" Background="Transparent" BorderBrush="Black" BorderThickness="2" CornerRadius="5"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"> <StackPanel> <fa:IconImage MaxHeight="50" Icon="User" /> <TextBlock Width="Auto" Height="Auto" FontSize="16" Text="{TemplateBinding Content}" /> </StackPanel> </ContentPresenter> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="border" Property="Background" Value="LightBlue" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </code></pre> <p>并且 TextBlock 文本没有绑定到内容</p> <p>我尝试使用不同的属性来绑定,但它不起作用</p> </question> <answer tick="false" vote="0"> <p><pre><code>ContentPresenter</code></pre> 不允许使用 XAML 内容语法定义内容。这是因为 <pre><code>ContentPresenter</code></pre> 并非源自 <pre><code>ContentControl</code></pre>。 <pre><code>ConTentControl</code></pre> 类型用 <pre><code>ContentPropertyAttribute</code></pre> 属性修饰,该属性继承给所有继承者。并且 <pre><code>ContentPresenter</code></pre> 本身并不声明内容属性。因此,“ContentPresenter”不支持 XAML 内容语法。</p> <p><pre><code>ContentPresenter</code></pre> 用于 <pre><code>ContentControl</code></pre> 的模板内,以实际渲染 <pre><code>ContentControl.Content</code></pre> 属性的值。因为它支持模板,所以可以渲染任何内容。<br/> 如果您覆盖 <pre><code>Controltemplate</code></pre> 的 <pre><code>ContentControl</code></pre>(例如 <pre><code>RadioButton</code></pre>),您通常会将 <pre><code>ContentPresenter</code></pre> 嵌入到新布局中。<br/> 在您的情况下,您尝试通过添加 <pre><code>ContentPresenter</code></pre> 来替换 <pre><code>TextBlock</code></pre> 来呈现内容。这极大地限制了可重用性,因为现在内容只能是<pre><code>string</code></pre>。因此,建议的方法是将 <pre><code>ContentPresenter</code></pre> 嵌入到扩展布局中。您总是希望显示 <pre><code>ContentControl.Content</code></pre> 值,因此您总是会嵌入 <pre><code>ContentPresenter</code></pre>。</p> <p>也不要在本地设置 <pre><code>Border</code></pre> 属性,例如 <pre><code>Background</code></pre> 属性,因为这会通过在模板化父级上分配本地值来消除自定义(例如 <pre><code>RadioButton Background="Red" /></code></pre> 将不再起作用)。<br/> 相反,使用 <pre><code>TemplateBinding</code></pre> 将这些属性绑定到 <pre><code>ControlTemplate</code></pre> 的所有者,并使用 <pre><code>Style.Setters</code></pre> 设置默认值。</p> <p><strong>推荐解决方案</strong><br/> 将 <pre><code>ContentPresenter</code></pre> 嵌入到自定义布局中:</p> <pre><code><Style x:Key="UserRadioButton" TargetType="RadioButton"> <Setter Property="Background" Value="Transparent" /> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="RadioButton"> <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" CornerRadius="5"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <fa:IconImage MaxHeight="50" Icon="User" /> <!-- Automatically shows the value of the Content property . and also inherits properties like FontSize, FontWeight etc. from the templated parent control. --> <ContentPresenter /> </StackPanel> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </code></pre> <hr/> <p>为了完整起见,如果您想用 <pre><code>ContentPresenter</code></pre> 替换 <pre><code>TextBlock</code></pre>,您可以使用以下不同的变体。<br/> 请注意,下面的这些示例都不是推荐的解决方案。</p> <p><strong>示例1(不推荐)</strong><br/> 显式设置 <pre><code>ContentPrersenter.Content</code></pre>:</p> <pre><code><ControlTemplate TargetType="RadioButton"> <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" CornerRadius="5"> <ContentPresenter> <!-- The XAML content syntax is not supported by the ContentPresenter. However, we can use the XAML property element syntax to set the Content: --> <ContentPresenter.Content> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <fa:IconImage MaxHeight="50" Icon="User" /> <TextBlock Width="Auto" Height="Auto" FontSize="16" Text="{TemplateBinding Content}" /> </StackPanel> <ContentPresenter.Content> </ContentPresenter> </Border> </ControlTemplate> </code></pre> <p><strong>示例2(不推荐)</strong><br/> 只需将 <pre><code>ContentPrersenter</code></pre> 从布局中删除即可,因为其内容已在示例 1 中明确定义,这实际上使 <pre><code>ContentPresenter</code></pre> 毫无意义:</p> <pre><code><ControlTemplate TargetType="RadioButton"> <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" CornerRadius="5"> <!-- Because the Content is presented using the TextBlock the ContentPresenter has no more use and can be dropped from the layout. --> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <fa:IconImage MaxHeight="50" Icon="User" /> <TextBlock Width="Auto" Height="Auto" FontSize="16" Text="{TemplateBinding Content}" /> </StackPanel> </Border> </ControlTemplate> </code></pre> <p><strong>示例3(推荐用于某些场景,例如需要保留原始交互行为,如鼠标悬停状态效果)</strong><br/> 更有用的替代方法是直接在元素上直接定义 <pre><code>ContentControl.Content</code></pre> 的值,例如</p> <pre><code><RadioButton> <RadioButton.Content> <TextBlock Text="Some text" /> </RadioButton.Content> </RadioButton> </code></pre> <p>或在<pre><code>Style</code></pre>的帮助下:</p> <pre><code><Style x:Key="UserRadioButton" TargetType="RadioButton"> <Setter Property="Content"> <Setter.Value> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <fa:IconImage MaxHeight="50" Icon="User" /> <!-- This example binds the the TextBlock.Text property to the current DataContext of the styled control (RadioButton). --> <TextBlock Text="{Binding textPropertyOfDataContext}" /> </StackPanel> </Setter.Value> </Setter> </Style> </code></pre> </answer> </body></html>
我有一个带有进度条的 C# wpf 项目。 我试图在线程操作期间更新进度条,但没有任何反应。 使用调度程序应该可以完成这项工作,但它不起作用......
我试图在 Common.xaml 中定义一个公共宽度资源,它将由不同的控件共享,如下所示: 20 然后我用它...
如何在 C# WPF 中使用 Oxyplot 绘制给定旋转角度的椭圆?
OxyPlot是.NET的跨平台绘图库,制作绘图非常方便, 现在这里有一种情况,我必须在 XY 散点图上绘制一个 95% 置信度的椭圆。 Oxyplot 提供...
我正在构建一个 WPF 浏览器应用程序,因此它需要许多客户端特定的功能。 在调试过程中,当我尝试在 IE Edge 中运行此应用程序时,它开始以错误的方式运行...
我正在制作一个自定义控件,它是一个可扩展/可折叠面板,然后我可以用其他控件填充它。我不确定如何将展开/折叠命令连接到按钮。 我用过这个...
对于窗口宽度我使用: 大小到内容=“宽度” 但对于高度,我用手硬编码。但是如何才能让窗口最多显示 N 个数据网格项呢? 所以如果有我...
我有一个包含 RibbonGroup 的 wpf RibbonTab。 我正在尝试将 RibbonButtons 动态添加到 RibbonGroup 中。 我可以让它显示我的 ObservableCollection 项目中的第一个项目。 我有
将选定的 WPF DataGridCell 设置为聚焦且可编辑事件
Woot,第一篇 Stack Overflow 帖子!我被要求开发一个桌面应用程序来改进我公司的库存流程。我在学校接触过 WPF,我想我应该从那里开始。之后
WPF DataGrid - 滚动 RowDetails 跳转到下一个条目
我有一个 DataGrid,它的 RowDetailTemplate 中有一个 ScrollViewer。我已经实现了 PreviewMouseWheel 事件的处理程序,并且如果 ScrollViewer h...
我已将默认菜单控件添加到我的用户控件中。我需要设置菜单样式以删除包含图标或复选框空间的左边距。我怎样才能做到这一点? XAML: ... 我已将默认菜单控件添加到我的用户控件中。我需要设置菜单样式以删除包含图标或复选框空间的左边距。我该怎么做? XAML: <Menu> <MenuItem Header="MyMenu" FontSize="10"> <MenuItem Header="Options..." /> <MenuItem Header="About" /> </MenuItem> </Menu> 它目前的渲染方式与任何其他开箱即用的菜单控件一样: 我不希望菜单项左侧有边距或列。这通常用于图标等。 我认为这就是你所追求的(再次,使用Expression Blend来解决它,但就它显示的内容而言,它是我能得到的最简约的......并且花了很多时间来玩弄).. .您可以将以下内容放入空白 WPF 应用程序中作为示例: <Window x:Class="MenuItemWithNoIcon.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> <SolidColorBrush x:Key="MenuItem.Highlight.Background" Color="#3D26A0DA"/> <SolidColorBrush x:Key="MenuItem.Highlight.Border" Color="#FF26A0DA"/> <SolidColorBrush x:Key="Menu.Disabled.Foreground" Color="#FF707070"/> <SolidColorBrush x:Key="MenuItem.Highlight.Disabled.Background" Color="#0A000000"/> <SolidColorBrush x:Key="MenuItem.Highlight.Disabled.Border" Color="#21000000"/> <SolidColorBrush x:Key="MenuItem.Selected.Border" Color="#FF26A0DA"/> <SolidColorBrush x:Key="MenuItem.Selected.Background" Color="#3D26A0DA"/> <Geometry x:Key="Checkmark">F1 M 10.0,1.2 L 4.7,9.1 L 4.5,9.1 L 0,5.2 L 1.3,3.5 L 4.3,6.1L 8.3,0 L 10.0,1.2 Z</Geometry> <SolidColorBrush x:Key="Menu.Static.Foreground" Color="#FF212121"/> <ControlTemplate x:Key="{ComponentResourceKey ResourceId=SubmenuItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}" TargetType="{x:Type MenuItem}"> <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Height="22" SnapsToDevicePixels="true"> <Grid Margin="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <ContentPresenter x:Name="menuHeaderContainer" ContentSource="Header" HorizontalAlignment="Stretch" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Stretch"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="Icon" Value="{x:Null}"/> <Trigger Property="IsChecked" Value="True"/> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Background}"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Border}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{StaticResource Menu.Disabled.Foreground}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsHighlighted" Value="True"/> <Condition Property="IsEnabled" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Disabled.Background}"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Disabled.Border}"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> <SolidColorBrush x:Key="Menu.Static.Border" Color="#FF999999"/> <SolidColorBrush x:Key="Menu.Static.Background" Color="#FFF0F0F0"/> <SolidColorBrush x:Key="Menu.Static.Separator" Color="#FFD7D7D7"/> <Geometry x:Key="UpArrow">M 0,4 L 3.5,0 L 7,4 Z</Geometry> <Style x:Key="MenuScrollButton" BasedOn="{x:Null}" TargetType="{x:Type RepeatButton}"> <Setter Property="ClickMode" Value="Hover"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Border x:Name="templateRoot" BorderBrush="Transparent" BorderThickness="1" Background="Transparent" SnapsToDevicePixels="true"> <ContentPresenter HorizontalAlignment="Center" Margin="6" VerticalAlignment="Center"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <MenuScrollingVisibilityConverter x:Key="MenuScrollingVisibilityConverter"/> <Geometry x:Key="DownArrow">M 0,0 L 3.5,4 L 7,0 Z</Geometry> <Style x:Key="{ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}" BasedOn="{x:Null}" TargetType="{x:Type ScrollViewer}"> <Setter Property="HorizontalScrollBarVisibility" Value="Hidden"/> <Setter Property="VerticalScrollBarVisibility" Value="Auto"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ScrollViewer}"> <Grid SnapsToDevicePixels="true"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Border Grid.Column="0" Grid.Row="1"> <ScrollContentPresenter CanContentScroll="{TemplateBinding CanContentScroll}" Margin="{TemplateBinding Padding}"/> </Border> <RepeatButton Grid.Column="0" CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Command="{x:Static ScrollBar.LineUpCommand}" Focusable="false" Grid.Row="0" Style="{StaticResource MenuScrollButton}"> <RepeatButton.Visibility> <MultiBinding ConverterParameter="0" Converter="{StaticResource MenuScrollingVisibilityConverter}" FallbackValue="Visibility.Collapsed"> <Binding Path="ComputedVerticalScrollBarVisibility" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="VerticalOffset" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="ExtentHeight" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="ViewportHeight" RelativeSource="{RelativeSource TemplatedParent}"/> </MultiBinding> </RepeatButton.Visibility> <Path Data="{StaticResource UpArrow}" Fill="{StaticResource Menu.Static.Foreground}"/> </RepeatButton> <RepeatButton Grid.Column="0" CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Command="{x:Static ScrollBar.LineDownCommand}" Focusable="false" Grid.Row="2" Style="{StaticResource MenuScrollButton}"> <RepeatButton.Visibility> <MultiBinding ConverterParameter="100" Converter="{StaticResource MenuScrollingVisibilityConverter}" FallbackValue="Visibility.Collapsed"> <Binding Path="ComputedVerticalScrollBarVisibility" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="VerticalOffset" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="ExtentHeight" RelativeSource="{RelativeSource TemplatedParent}"/> <Binding Path="ViewportHeight" RelativeSource="{RelativeSource TemplatedParent}"/> </MultiBinding> </RepeatButton.Visibility> <Path Data="{StaticResource DownArrow}" Fill="{StaticResource Menu.Static.Foreground}"/> </RepeatButton> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> <ControlTemplate x:Key="{ComponentResourceKey ResourceId=TopLevelHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}" TargetType="{x:Type MenuItem}"> <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> <Grid VerticalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Path x:Name="GlyphPanel" Data="{StaticResource Checkmark}" Fill="{TemplateBinding Foreground}" FlowDirection="LeftToRight" Margin="3" Visibility="Collapsed" VerticalAlignment="Center"/> <ContentPresenter Grid.Column="1" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> <Popup x:Name="PART_Popup" AllowsTransparency="true" Focusable="false" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom" PlacementTarget="{Binding ElementName=templateRoot}"> <Border x:Name="SubMenuBorder" BorderBrush="{StaticResource Menu.Static.Border}" BorderThickness="1" Background="{StaticResource Menu.Static.Background}" Padding="0"> <ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"> <Grid RenderOptions.ClearTypeHint="Enabled"> <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0"> <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=SubMenuBorder}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/> </Canvas> <Rectangle Fill="{StaticResource Menu.Static.Separator}" HorizontalAlignment="Left" Margin="0" Width="1"/> <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="true" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/> </Grid> </ScrollViewer> </Border> </Popup> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSuspendingPopupAnimation" Value="true"> <Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/> </Trigger> <Trigger Property="Icon" Value="{x:Null}"/> <Trigger Property="IsChecked" Value="true"> <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> </Trigger> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Background}"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Border}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{StaticResource Menu.Disabled.Foreground}"/> <Setter Property="Fill" TargetName="GlyphPanel" Value="{StaticResource Menu.Disabled.Foreground}"/> </Trigger> <Trigger Property="ScrollViewer.CanContentScroll" SourceName="SubMenuScrollViewer" Value="false"> <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/> <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> <ControlTemplate x:Key="{ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}" TargetType="{x:Type MenuItem}"> <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> <Grid VerticalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <ContentPresenter x:Name="Icon" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> <Path x:Name="GlyphPanel" Data="{StaticResource Checkmark}" Fill="{StaticResource Menu.Static.Foreground}" FlowDirection="LeftToRight" Margin="3" Visibility="Collapsed" VerticalAlignment="Center"/> <ContentPresenter Grid.Column="1" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="Icon" Value="{x:Null}"> <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> </Trigger> <Trigger Property="IsChecked" Value="true"> <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> </Trigger> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Background}"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Border}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{StaticResource Menu.Disabled.Foreground}"/> <Setter Property="Fill" TargetName="GlyphPanel" Value="{StaticResource Menu.Disabled.Foreground}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsHighlighted" Value="True"/> <Condition Property="IsEnabled" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Disabled.Background}"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Disabled.Border}"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> <Geometry x:Key="RightArrow">M 0,0 L 4,3.5 L 0,7 Z</Geometry> <ControlTemplate x:Key="{ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}" TargetType="{x:Type MenuItem}"> <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Height="22" SnapsToDevicePixels="true"> <Grid Margin="-1"> <Grid.ColumnDefinitions> <ColumnDefinition MinWidth="22" SharedSizeGroup="MenuItemIconColumnGroup" Width="Auto"/> <ColumnDefinition Width="13"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="30"/> <ColumnDefinition SharedSizeGroup="MenuItemIGTColumnGroup" Width="Auto"/> <ColumnDefinition Width="20"/> </Grid.ColumnDefinitions> <ContentPresenter x:Name="Icon" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> <Border x:Name="GlyphPanel" BorderBrush="{StaticResource MenuItem.Highlight.Border}" BorderThickness="1" Background="{StaticResource MenuItem.Highlight.Background}" Height="22" Margin="-1,0,0,0" Visibility="Hidden" VerticalAlignment="Center" Width="22"> <Path x:Name="Glyph" Data="{DynamicResource Checkmark}" Fill="{StaticResource Menu.Static.Foreground}" FlowDirection="LeftToRight" Height="11" Width="9"/> </Border> <ContentPresenter Grid.Column="2" ContentSource="Header" HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/> <TextBlock Grid.Column="4" Margin="{TemplateBinding Padding}" Opacity="0.7" Text="{TemplateBinding InputGestureText}" VerticalAlignment="Center"/> <Path x:Name="RightArrow" Grid.Column="5" Data="{StaticResource RightArrow}" Fill="{StaticResource Menu.Static.Foreground}" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center"/> <Popup x:Name="PART_Popup" AllowsTransparency="true" Focusable="false" HorizontalOffset="-2" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Right" VerticalOffset="-3"> <Border x:Name="SubMenuBorder" BorderBrush="{StaticResource Menu.Static.Border}" BorderThickness="1" Background="{StaticResource Menu.Static.Background}" Padding="2"> <ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"> <Grid RenderOptions.ClearTypeHint="Enabled"> <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0"> <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=SubMenuBorder}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/> </Canvas> <Rectangle Fill="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1"/> <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="true" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/> </Grid> </ScrollViewer> </Border> </Popup> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSuspendingPopupAnimation" Value="true"> <Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/> </Trigger> <Trigger Property="Icon" Value="{x:Null}"> <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> </Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> </Trigger> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" TargetName="templateRoot" Value="Transparent"/> <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Border}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{StaticResource Menu.Disabled.Foreground}"/> <Setter Property="Fill" TargetName="Glyph" Value="{StaticResource Menu.Disabled.Foreground}"/> <Setter Property="Fill" TargetName="RightArrow" Value="{StaticResource Menu.Disabled.Foreground}"/> </Trigger> <Trigger Property="ScrollViewer.CanContentScroll" SourceName="SubMenuScrollViewer" Value="false"> <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/> <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> <Style x:Key="MenuItemStyle1" TargetType="{x:Type MenuItem}"> <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="ScrollViewer.PanningMode" Value="Both"/> <Setter Property="Stylus.IsFlicksEnabled" Value="False"/> <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> <Style.Triggers> <Trigger Property="Role" Value="TopLevelHeader"> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="Foreground" Value="{StaticResource Menu.Static.Foreground}"/> <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> <Setter Property="Padding" Value="6,0"/> </Trigger> <Trigger Property="Role" Value="TopLevelItem"> <Setter Property="Background" Value="{StaticResource Menu.Static.Background}"/> <Setter Property="BorderBrush" Value="{StaticResource Menu.Static.Border}"/> <Setter Property="Foreground" Value="{StaticResource Menu.Static.Foreground}"/> <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> <Setter Property="Padding" Value="6,0"/> </Trigger> <Trigger Property="Role" Value="SubmenuHeader"> <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> </Trigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Menu> <MenuItem Header="File" Style="{DynamicResource MenuItemStyle1}"> <MenuItem Header="Exit" Style="{DynamicResource MenuItemStyle1}"/> </MenuItem> </Menu> </Grid> </Window> 简单快捷的方法如下。创建 ItemsPanelTemplate 资源: <ItemsPanelTemplate x:Key="MenuItemPanelTemplate"> <StackPanel Background="White"/> </ItemsPanelTemplate> 将以下MenuItem样式添加到资源中,就完成了。 <Style TargetType="{x:Type MenuItem}"> <Setter Property="ItemsPanel" Value="{StaticResource MenuItemPanelTemplate}"/> </Style> 要将相同的 Style 应用于 ContextMenu,您需要再创建一个 Style,如下所示: <Style TargetType="{x:Type ContextMenu}"> <Setter Property="ItemsPanel" Value="{StaticResource MenuItemPanelTemplate}"/> </Style> 在上下文菜单之上,您还必须添加: <ContextMenu ItemsSource="{Binding MyItems}" > <ContextMenu.ItemTemplate> <DataTemplate> <TextBlock Margin="-20,0,-40,0" Text="{Binding Name}"/> </DataTemplate> </ContextMenu.ItemTemplate> </ContextMenu> 因此它将覆盖图标空间并显示大小写文本块。这是最简单、最容易的解决方案。 这不是很直接,但您需要创建一个 MenuItemStyle,最简单的方法是通过 Expression Blend: <Menu> <MenuItem Header="MyMenu" Style="{DynamicResource MenuItemStyle1}"> <MenuItem Header="Options..." /> <MenuItem Header="About" /> </MenuItem> </Menu> 它创建了一组极其冗长的模板和样式,您需要编辑菜单项以删除网格的固定宽度第一列,然后在 SubMenuBorder ContentControl 模板中删除形成背景阴影的矩形。我附上了一个已删除边距的示例项目。 在此处下载示例项目。 这里有两个选项: 简短、简单、直接。将 ItemsPanelTemplate 设置为 MenuItem 或 ContextMenu,具体取决于您使用的菜单类型(请参阅详细信息)。 激进。从头开始重写 Menu 风格。有两种即用型: 来自 MahApps.Metro 的XAML 风格的Menu(普通菜单和ContextMenu) Jeff Wilcox 的风格启发了 MahApps 的前一个风格(link) 我的简单方法是在 ItemTemplate 中为网格使用负边距 <ContextMenu.ItemTemplate> <DataTemplate> <Grid Margin="-20,0,-40,0"><!--this part is important--> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="1*"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Text="{Binding Ident}"/> <TextBlock Grid.Column="1" Text="{Binding Description}"/> </Grid> </DataTemplate> </ContextMenu.ItemTemplate> 查看完整答案这里 我正在使用 WPF Notifyicon(硬编码)并使用以下代码删除了菜单的图标部分: <Window ...> <Window.Resources> <ItemsPanelTemplate x:Key="MenuTPL"> <StackPanel Margin="-30,0,0,0" Background="White"/> </ItemsPanelTemplate> </Window.Resources> <Grid> ... <ContextMenu> <ContextMenu.Style> <Style TargetType="{x:Type ContextMenu}"> <Setter Property="ItemsPanel" Value="{StaticResource MenuTPL}"/> </Style> </ContextMenu.Style> <MenuItem Header="Exit" Click="Exit_MenuItemClick"/> </ContextMenu> ... </Grid> </Window> 要删除空格并且从不使用图标,您必须更改 MenuItem.SubmenuItemTemplateKey 的模板或 MenuItem 的模板。 如果您只需要摆脱垂直线并继续使用图标空间,请遵循此答案。 带有网格的 Windows 有我的 CustomContextMenu.xaml 作为网格资源: <Window ...> <Grid> <Grid.Resources> <ResourceDictionary Source="CustomContextMenu.xaml"/> </Grid.Resources> <Grid.ContextMenu> <ContextMenu> <MenuItem Header="Menu item 1" > <MenuItem Header="Menu item 2" > <MenuItem.Icon> <Image Source="icon.jpg"/> </MenuItem.Icon> </MenuItem> </MenuItem> <Separator Style="{StaticResource MySeparatorStyle}" /> <MenuItem IsEnabled="False" Header="Menu item 3" /> </ContextMenu> </Grid.ContextMenu> <TextBlock>test</TextBlock> </Grid> </Window> 这是我的 CustomContextMenu.xaml,它有一个 CustomSeparatorStyle 模板,可将分隔线延伸到上下文菜单的左边距。还有一个 ContextMenu 模板来隐藏垂直线。 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!-- Outer menu --> <Style TargetType="{x:Type ContextMenu}"> <Setter Property="OverridesDefaultStyle" Value="True" /> <Setter Property="MaxWidth" Value="295" /> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ContextMenu}"> <!-- Here is where you change the border thickness to zero on the menu --> <Border x:Name="Border" Background="#CCCCC7" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="0"> <Border.Effect> <DropShadowEffect Direction="135" Opacity=".8" ShadowDepth="2" Color="Black" /> </Border.Effect> <StackPanel ClipToBounds="True" IsItemsHost="True" Orientation="Vertical" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="Border" Property="Background" Value="#F7F7F4" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Separator --> <Style x:Key="CustomSeparatorStyle" TargetType="{x:Type Separator}"> <Setter Property="Height" Value="1" /> <Setter Property="Margin" Value="-30,5,0,5" /> <Setter Property="Background" Value="#F7F7F4" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Separator}"> <Border BorderBrush="#DADAD6" BorderThickness="1" /> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> 右侧菜单是使用上面的代码创建的。您可以注意到大小和阴影的差异。为了保留原始菜单的阴影,您必须排除 Border.Effect。 使用 RadMenuGroupItem。 RadMenuGroupItem 继承自 RadMenuItem 类,它用作 RadMenuItem 下拉列表的容器。换句话说,任何 UI 元素都可以放置在 RadMenuGroupItem 内部。默认情况下,RadMenuGroupItem 的背景颜色为白色,并且没有与 RadMenuItem 不同颜色的图标区域,因此您可以轻松地在下拉列表中使用不同大小的图标。除此之外,RadMenuGroupItem 还有一个 Header 属性,该属性显示在所有组项的顶部。 <telerik:RadMenu VerticalAlignment="Top"> <telerik:RadMenuItem Header="Shapes" /> <telerik:RadMenuItem Header="Sizes"> <telerik:RadMenuGroupItem Header="Header"> <telerik:RadMenuItem Header="Small" IconTemplate="{StaticResource IconTemplate}" IconColumnWidth="35" Height="35" /> <telerik:RadMenuItem Header="Medium" IconTemplate="{StaticResource IconTemplate}" IconColumnWidth="45" Height="45" /> <telerik:RadMenuItem Header="Large" IconTemplate="{StaticResource IconTemplate}" IconColumnWidth="55" Height="55" /> </telerik:RadMenuGroupItem> </telerik:RadMenuItem> 这就是结果: 感谢您的成功想法。对于 .net Framework 4.5 和 VS 2012,我相应地为 ContextMenu 和 MenuItem 编写了: private const double ICON_SIZE = 32; void ContextMenu_Loaded(object sender, System.Windows.RoutedEventArgs e) { if (_pointerControl.ContextMenu.Template != null) { System.Windows.Shapes.Rectangle r1 = _pointerControl.ContextMenu.Template.FindName("3_T", _pointerControl.ContextMenu) as System.Windows.Shapes.Rectangle; System.Windows.Shapes.Rectangle r2 = _pointerControl.ContextMenu.Template.FindName("4_T", _pointerControl.ContextMenu) as System.Windows.Shapes.Rectangle; System.Windows.Shapes.Rectangle r3 = _pointerControl.ContextMenu.Template.FindName("5_T", _pointerControl.ContextMenu) as System.Windows.Shapes.Rectangle; double width = Math.Max(28, ICON_SIZE+14); r1.Width = width; r2.Margin = new System.Windows.Thickness(width + 1, 2, 0, 2); r3.Margin = new System.Windows.Thickness(width + 2, 2, 0, 2); } } void mi_Loaded(object sender, System.Windows.RoutedEventArgs e) { System.Windows.Controls.MenuItem mi = sender as System.Windows.Controls.MenuItem; if (mi != null && mi.Template != null) { System.Windows.Controls.ContentPresenter cp = mi.Template.FindName("Icon", mi) as System.Windows.Controls.ContentPresenter; cp.Height = ICON_SIZE + 6; cp.Width = ICON_SIZE + 6; } }
“...”类型的值无法添加到“UIElementCollection”类型的集合或字典中
通过 XAML 添加自定义控件时出现以下错误。可能的原因是什么? 类型“...”的值无法添加到类型“
Visual Studio 不允许我在 DLL 项目中创建 WPF 窗口是否有原因? 我通过在应用程序项目中创建一个窗口并将其复制到我的 DLL 项目中“解决”了这个问题。 我还发现了...
我正在尝试同时向两个画布添加网格和标签。 从 page.xaml.cs 添加到页面画布是可行的,但也从 page.xaml.cs 添加到“CellPageSettings”画布到...
如何使用另一个应用程序修改AppData文件夹中的user.config?
我想从安装程序或不属于应用程序一部分的测试中编辑 user.config 文件,并使用我要编辑的配置。因此我需要 user.config 的路径。 user.config 的路径是...