C# 在RibbonSplitButton中高亮显示上面的所有元素
我试图复制VisualStudio(可能还有其他)功能,该功能突出显示列表中鼠标所在项目上方显示的所有元素 (注意,鼠标位于顶部第6行上方)。如图所示,当鼠标位于第6个元素上时,undo命令1-5高亮显示 目前,在我的实际程序中实现虚拟应用程序之前,我正在尝试了解如何在虚拟应用程序中执行它。我找到了一个解决方案,但它使用了一个列表框,在动态添加项目时,无法处理添加项目的方式。以下是我到目前为止的情况: 在我的XAML中:C# 在RibbonSplitButton中高亮显示上面的所有元素,c#,wpf,C#,Wpf,我试图复制VisualStudio(可能还有其他)功能,该功能突出显示列表中鼠标所在项目上方显示的所有元素 (注意,鼠标位于顶部第6行上方)。如图所示,当鼠标位于第6个元素上时,undo命令1-5高亮显示 目前,在我的实际程序中实现虚拟应用程序之前,我正在尝试了解如何在虚拟应用程序中执行它。我找到了一个解决方案,但它使用了一个列表框,在动态添加项目时,无法处理添加项目的方式。以下是我到目前为止的情况: 在我的XAML中: <TextBox Width="60" Margin="2" Te
<TextBox Width="60" Margin="2" Text="{Binding SomeText, UpdateSourceTrigger=PropertyChanged}"/>
<RibbonSplitButton Label="Add" HorizontalContentAlignment="Center" Command="{Binding addToStack}" ItemsSource="{Binding Path=AddedItems}" VerticalContentAlignment="Center" Margin="2" Padding="2" Name="AddRSB" MouseOverBackground="{x:Static SystemColors.HighlightBrush}" MouseMove="RibbonSplitButton_MouseMove">
<RibbonSplitButton.Resources>
<Style TargetType="{x:Type RibbonMenuItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SelectedBelow}" Value="True">
<Setter Property="MouseOverBorderBrush">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.5"/>
</Setter.Value>
</Setter>
<Setter Property="MouseOverBackground">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.1"/>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.5"/>
</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.1"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
<Setter Property="Foreground" Value="Red"/>
</Style>
</RibbonSplitButton.Resources>
</RibbonSplitButton>
最后,在我的代码隐藏中:
private void RibbonSplitButton_MouseMove(object sender, MouseEventArgs e)
{
var itemSelected = false;
for(int i = AddRSB.Items.Count - 1; i >= 0; i--)
{
var currentItem = AddRSB.ItemContainerGenerator.ContainerFromIndex(i) as RibbonMenuItem;
if(currentItem != null)
{
if (itemSelected)
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = true;
}
else if(IsMouseOverItem(currentItem, e.GetPosition(currentItem)))
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = true;
itemSelected = true;
}
else
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = false;
}
}
}
}
问题是鼠标所在项目上方的项目在左侧有淡入淡出
如果我删除
MouseOver…
属性,所有突出显示的部分都会在突出显示和未突出显示之间闪烁。我该如何去除褪色的部分?是否有更好的方法来实现此功能(RibbonSplitButton
和MouseMoveEvent
似乎是实现此功能的最佳选择)?只需在RibbonMenuItem样式中设置模板属性,您就不会再获得渐变效果:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Width="auto"
MinWidth="50"
CornerRadius="3"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}">
<TextBlock Text="{Binding}"
Padding="15,3"
HorizontalAlignment="Stretch"
TextAlignment="Left"
Background="{TemplateBinding Background}"
Foreground="{TemplateBinding Foreground}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
漂亮!工作起来很有魅力!(当我有能力时,将授予赏金)
private void RibbonSplitButton_MouseMove(object sender, MouseEventArgs e)
{
var itemSelected = false;
for(int i = AddRSB.Items.Count - 1; i >= 0; i--)
{
var currentItem = AddRSB.ItemContainerGenerator.ContainerFromIndex(i) as RibbonMenuItem;
if(currentItem != null)
{
if (itemSelected)
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = true;
}
else if(IsMouseOverItem(currentItem, e.GetPosition(currentItem)))
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = true;
itemSelected = true;
}
else
{
((CustomRibbonMenuItem)currentItem.DataContext).SelectedBelow = false;
}
}
}
}
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Width="auto"
MinWidth="50"
CornerRadius="3"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}">
<TextBlock Text="{Binding}"
Padding="15,3"
HorizontalAlignment="Stretch"
TextAlignment="Left"
Background="{TemplateBinding Background}"
Foreground="{TemplateBinding Foreground}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>