我正在使用Datagrids来显示大部分数据的程序。为了匹配旧版本的程序,必须从WPF旋转内置的Datagrid,以便每个项目都是一列而不是一行。
示例:左边是wpf中内置的行为,右边是我们想要实现的内容。
到目前为止,我们遇到的唯一解决方案是从xaml旋转网格。这样可以正常工作并获得我们想要的外观,但它会导致几个可用性问题。其他解决这个问题的方法将不胜感激。
<Style x:Key="DataGridRotatedStyle" TargetType="DataGrid" BasedOn="{StaticResource DataGridTabGrids}">
<Setter Property="RowDetailsTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<StackPanel.LayoutTransform>
<TransformGroup>
<RotateTransform Angle="90" />
<MatrixTransform Matrix="-1, 0, 0, 1, 0, 0" />
</TransformGroup>
</StackPanel.LayoutTransform>
<TextBlock Height="100" Text="Binding Image" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="LayoutTransform">
<Setter.Value>
<TransformGroup>
<RotateTransform Angle="90" />
<MatrixTransform Matrix="-1, 0, 0, 1, 0, 0" />
</TransformGroup>
</Setter.Value>
</Setter>
<Setter Property="TextOptions.TextFormattingMode" Value="Display" />
<Setter Property="RowHeight" Value="100"/>
</Style >
<Style x:Key="DataGridRotatedCellsBaseStyle" TargetType="Control">
<Setter Property="LayoutTransform">
<Setter.Value>
<TransformGroup>
<RotateTransform Angle="-90" />
<ScaleTransform ScaleX="1" ScaleY="-1" />
</TransformGroup>
</Setter.Value>
</Setter>
<Setter Property="TextOptions.TextFormattingMode" Value="Display" />
</Style >
如果这是解决问题的唯一实际解决方案,那么我们还没有找到一个很好的解决方案来解决这种方法引入的错误。
首先,箭头键全部重新排列,因为它们没有接受相同的旋转处理。我已经看到了捕获代码背后的关键笔划的解决方案,只是更改,例如,左箭头向上箭头。但这似乎是一种非常优秀的方式。我也看到了你捕获按键事件的位置并手动设置了所选的单元格,但同样,这对我来说似乎是不洁净的。
其次,鼠标滚轮滚动在其逻辑中也同样缺乏旋转,现在水平滚动。建议的解决方案类似于箭头键。另一种解决方案是设置自己的滚动查看器,然后将鼠标滚轮事件从数据网格重新路由到新的滚动查看器。
当用户开始输入时,更改颜色格式,对齐问题以及自动进入编辑模式的能力还存在其他问题。
所以我的首要问题是:这甚至是正确的方法吗?如果是这样,这些问题的解决方案是否必然是混乱的,还是有更清洁的方法来解决这一问题?
答案 0 :(得分:0)
就键盘箭头而言,我遇到了同样的问题,所以我在这里分享我的解决方案。
就我而言,只需订阅 PreviewKeyDown
的 DataGrid
<DataGrid SelectionMode="Single"PreviewKeyDown="DataGrid_PreviewKeyDown"
在后面的代码中,您可以“修复”正确的密钥:
private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Left)
{
e.Handled = true;
Send(Key.Up);
}
if (e.Key == Key.Right)
{
e.Handled = true;
Send(Key.Down);
}
if (e.Key == Key.Down)
{
e.Handled = true;
Send(Key.Right);
}
if (e.Key == Key.Up)
{
e.Handled = true;
Send(Key.Left);
}
}
其中 Send
被改编为 from this answer。
private void Send(Key key)
{
if (Keyboard.PrimaryDevice != null)
{
if (Keyboard.PrimaryDevice.ActiveSource != null)
{
var e1 = new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key) { RoutedEvent = Keyboard.KeyDownEvent };
bool b = InputManager.Current.ProcessInput(e1);
}
}
}