Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在RibbonSplitButton中高亮显示上面的所有元素_C#_Wpf - Fatal编程技术网

C# 在RibbonSplitButton中高亮显示上面的所有元素

C# 在RibbonSplitButton中高亮显示上面的所有元素,c#,wpf,C#,Wpf,我试图复制VisualStudio(可能还有其他)功能,该功能突出显示列表中鼠标所在项目上方显示的所有元素 (注意,鼠标位于顶部第6行上方)。如图所示,当鼠标位于第6个元素上时,undo命令1-5高亮显示 目前,在我的实际程序中实现虚拟应用程序之前,我正在尝试了解如何在虚拟应用程序中执行它。我找到了一个解决方案,但它使用了一个列表框,在动态添加项目时,无法处理添加项目的方式。以下是我到目前为止的情况: 在我的XAML中: <TextBox Width="60" Margin="2" Te

我试图复制VisualStudio(可能还有其他)功能,该功能突出显示列表中鼠标所在项目上方显示的所有元素

(注意,鼠标位于顶部第6行上方)。如图所示,当鼠标位于第6个元素上时,undo命令1-5高亮显示

目前,在我的实际程序中实现虚拟应用程序之前,我正在尝试了解如何在虚拟应用程序中执行它。我找到了一个解决方案,但它使用了一个列表框,在动态添加项目时,无法处理添加项目的方式。以下是我到目前为止的情况:

在我的XAML中:

<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>