【问题标题】:How to Disable Text Block Border in WPF Data Grid?如何在 WPF 数据网格中禁用文本块边框?
【发布时间】:2016-02-11 05:49:44
【问题描述】:

我在 DataGrid 中遇到 TextBlock 的问题。 我无法禁用 TextBlockBorder。 对于 TextBlock,没有名称为 BorderThicknessNo Property
那么我们如何禁用 TextBlock 的边框。

我在这里添加我的示例网格单元格样式

                               <DataGrid.CellStyle>
                                    <Style TargetType="DataGridCell">
                                        <Style.Triggers>                                               
                                            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                                                <Setter Property="BorderBrush" Value="DarkTurquoise" />
                                                <Setter Property="IsSelected" Value="True"/>
                                                <Setter Property="BorderThickness" Value="0"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </DataGrid.CellStyle>

我在这里添加我的整个 DataGrid 代码

 <DataGrid Name="gridcancelled" ItemsSource="{Binding}" HeadersVisibility="None" IsReadOnly="True" AutoGenerateColumns="False" GridLinesVisibility="Horizontal" Background="White"  Cursor="Hand"  MouseLeftButtonDown="gridcancelled_MouseLeftButton" Loaded="gridcancelled_Loaded" PreviewKeyDown="gridcancelled_PreviewKeyDown" RowHeight="44.9" SelectedIndex="0" HorizontalGridLinesBrush="{StaticResource BlueGridLine}" VerticalGridLinesBrush="{StaticResource BlueGridLine}" BorderThickness="1.5,1,1,1" BorderBrush="Gray">

                                <DataGrid.CellStyle>
                                    <Style TargetType="DataGridCell">
                                        <Style.Triggers>                                               
                                            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                                                <Setter Property="BorderBrush" Value="DarkTurquoise" />
                                                <Setter Property="IsSelected" Value="True"/>
                                                <Setter Property="BorderThickness" Value="0"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </DataGrid.CellStyle>

                                <DataGrid.Resources>
                                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="DarkTurquoise"/>
                                    <Style TargetType="{x:Type DataGridRow}">
                                        <Style.Triggers>
                                            <Trigger Property="IsMouseOver" Value="true">
                                                <Setter Property="Foreground" Value="White" />
                                                <Setter Property="Background" Value="DarkTurquoise" />
                                                <Setter Property="FontSize" Value="14"></Setter>
                                                <Setter Property="FontWeight" Value="Medium"></Setter>
                                            </Trigger>
                                            <Trigger Property="DataGridRow.IsSelected" Value="True">
                                                <Setter Property="Foreground" Value="White" />
                                                <Setter Property="Background" Value="DarkTurquoise" />
                                                <Setter Property="FontSize" Value="14"></Setter>
                                                <Setter Property="FontWeight" Value="Medium"></Setter>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </DataGrid.Resources>

                                <DataGrid.Columns>
                                    <DataGridTextColumn Binding="{Binding billId}" Width="220">
                                        <DataGridTextColumn.ElementStyle>
                                            <Style TargetType="TextBlock">
                                                <Setter Property="VerticalAlignment" Value="Center" />                                         
                                            </Style>
                                        </DataGridTextColumn.ElementStyle>
                                    </DataGridTextColumn>
                                        <DataGridTextColumn Binding="{Binding billDate}" Width="210" >
                                            <DataGridTextColumn.ElementStyle>
                                            <Style TargetType="TextBlock">
                                                <Setter Property="VerticalAlignment" Value="Center" />
                                                </Style>
                                        </DataGridTextColumn.ElementStyle>
                                    </DataGridTextColumn>
                                    <DataGridTextColumn Binding="{Binding counterId}" Width="210">
                                        <DataGridTextColumn.ElementStyle>
                                            <Style TargetType="TextBlock">
                                                <Setter Property="VerticalAlignment" Value="Center" />
                                                </Style>
                                        </DataGridTextColumn.ElementStyle>
                                    </DataGridTextColumn>
                                        <DataGridTextColumn Binding="{Binding cashierId}" Width="190" >
                                            <DataGridTextColumn.ElementStyle>
                                            <Style TargetType="TextBlock">
                                                <Setter Property="VerticalAlignment" Value="Center" />
                                                </Style>
                                        </DataGridTextColumn.ElementStyle>
                                    </DataGridTextColumn>
                                        <DataGridTextColumn Binding="{Binding dueAmount, StringFormat={}{0:0.00}}" Width="172">
                                            <DataGridTextColumn.ElementStyle>
                                            <Style TargetType="TextBlock">
                                                <Setter Property="HorizontalAlignment" Value="Right" />
                                                <Setter Property="VerticalAlignment" Value="Center" />
                                                    <Setter Property="Margin" Value="0,0,60,0"/>                                                    
                                                </Style>
                                        </DataGridTextColumn.ElementStyle>
                                    </DataGridTextColumn>
                                </DataGrid.Columns>
                            </DataGrid>

我在这里添加我的 PreviewKeyDown 事件代码

    private void gridcancelled_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up)
        {
            e.Handled = true;
            if (gridcancelled.SelectedIndex == 0)
            {
                gridcancelled.SelectedIndex = gridcancelled.Items.Count - 1;
            }
            else
            {
                gridcancelled.SelectedIndex--;
            }
        }
        if (e.Key == Key.Down)
        {
            e.Handled = true;

            if (gridcancelled.Items.Count - 1 > gridcancelled.SelectedIndex)
            {
                gridcancelled.SelectedIndex++;
            }
            else if (gridcancelled.SelectedIndex == gridcancelled.Items.Count - 1)
            {
                gridcancelled.SelectedIndex = 0;
            }
        }
    }

请给我你的建议。
提前致谢。

【问题讨论】:

  • 给出你的数据网格代码。我会编辑的。
  • 感谢您的回复@KyloRen 请检查我已添加示例代码...
  • 你是指单元格聚焦时显示的边框吗?
  • 屏幕截图中的边框在哪里? @sagar
  • 请检查我添加了 GUI ...我的问题是我为我的网格提供导航。当我移动上下箭头时,我没有获得下一行的焦点 @safi

标签: wpf datagrid


【解决方案1】:

更新:如下更改您的代码:

private void gridcancelled_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up)
        {               
            if (gridcancelled.SelectedIndex == 0)
            {
                gridcancelled.SelectedIndex = gridcancelled.Items.Count - 1;
                SetFocus(gridcancelled.SelectedIndex, gridcancelled.CurrentCell.Column.DisplayIndex);                    
            }
            else
            {
                gridcancelled.SelectedIndex--;
            }                
        }
        if (e.Key == Key.Down)
        {                
            if (gridcancelled.Items.Count - 1 > gridcancelled.SelectedIndex)
            {
                gridcancelled.SelectedIndex++;
            }
            else if (gridcancelled.SelectedIndex == gridcancelled.Items.Count - 1)
            {
                gridcancelled.SelectedIndex = 0;                   

                SetFocus(gridcancelled.SelectedIndex, gridcancelled.CurrentCell.Column.DisplayIndex);
            }               
        }
    }

    public void SetFocus(int SelectedIndex,int SelectedCellIndex)
    {
        var row = gridcancelled.ItemContainerGenerator.ContainerFromIndex(SelectedIndex) as DataGridRow;

        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);

        var cell = presenter.ItemContainerGenerator.ContainerFromIndex(SelectedCellIndex) as DataGridCell;

        Keyboard.Focus(cell);
    }

    public T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }

输出:

【讨论】:

  • 现在 GUI 问题已解决......但 KeyDown 事件没有触发 @kylo Ren
  • 使用 Out 使用 KeyDown 事件也可以正常工作...但是在这里我的问题是当用户选择一行并单击 Enter 关键字时我想做一些操作我需要做一些操作...所以我认为 Key Down 事件是不可能的,这就是为什么我选择 Preview_KeyDown 事件@kylo Ren
  • @sagar 你删除了 PreviewKeyDown 事件吗?
  • 是的,我已经删除了@kylo Ren。现在我的网格只包含 {MouseLeftButtonDown="gridcancelled_MouseLeftButton" Loaded="gridcancelled_Loaded"} 事件
  • 我想在 2 种情况下执行一些操作...一种是当用户用鼠标左键单击时,另一种是当用户选择一行并按下 Enter 关键字时...请给我你自己的建议我应该使用什么事件... @kylo Ren
【解决方案2】:

你的问题是FocusVisualStyle

   <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Style.Triggers>
                            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                                <Setter Property="BorderBrush" Value="DarkTurquoise" />
                                <Setter Property="IsSelected" Value="True"/>
                                <Setter Property="BorderThickness" Value="0"/>
                            </Trigger>
                        </Style.Triggers>
                        <Setter Property="FocusVisualStyle">
                            <Setter.Value>
                                <Style>
                                    <Setter Property="Control.Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <Rectangle Margin="-2" StrokeThickness="1" Stroke="Red"/>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>

【讨论】:

  • 对不起@safi 我仍然无法将焦点移到导航行。我想将焦点移到导航行...
  • @sagar 也提供 PreviewKeyDown 事件代码。如果你在那里写过任何代码
  • 请再次检查我的代码我已经添加了我的预览keydown事件代码@KyloRen
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2015-08-19
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多