刚刚接触WPF 记录遇到的一些问题 以及解决方式:(会一直更新)
一:用DataGrid时,切换页面会发现列表有一个铺开的过程
发现是给 DataGridTextColumn, 设置width时 设置的是 * ; 如果是 * 的话 是按照比例来划分,就会有一个这样列从小到大这样一个扩放的过程,当把列都设置了具体的数值 就不会存在这样的问题。
(width设置为*时)
(width设置为具体数字后,问题修复)
二:设置鼠标拖动时 没有效果
但是拖动并不生效
和拖动属于类似的问题:在radiobutton中设置了一个IsChecked的触发器,具体style如下:
<Style x:Key="borderStyle" TargetType="RadioButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border
x:Name="Border11" Width="100" Height="100" Margin="1" BorderBrush="Red" BorderThickness="1">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Content}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Border11" Property="Background" Value="Yellow" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
界面代码如下
<Grid>
<UniformGrid HorizontalAlignment="Center" VerticalAlignment="Center" Rows="1">
<RadioButton Content="点我一下" Style="{StaticResource borderStyle}" />
<RadioButton Content="点我一下" Style="{StaticResource borderStyle}" />
</UniformGrid>
</Grid>
点击radiobutton时看下效果:
发现只有点击textblock时才会触发事件;
这时候我们给上述两个窗体中增加 border的 Background="Transparent" 给Border设置一个透明色,就可以实现拖动 并且在点击radiobutton时点击空白处也可以触发事件。
总结: border,grid 这种控件 默认的背景色是null, 是brush类型 引用类型 默认无背景色,当没有设置背景色的时候 点击时候会默认穿透到下一层,只有设置背景色以后才能触发事件
三:使用资源字段设置全局样式
一个应用程序中,某个窗口需要使用样式,但是样式非常多,写在一个窗口中代码分类不方便。最好Style写在专门的xaml文件中,然后引用到窗口中,就像HTML引用外部css文件一样。
初衷:就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情。
首先在Styles文件夹创建了一个资源字段文件 命名为DataGridStyle 目的把DataGrid相关样式放在这个文件中:问价内容如下
前三行的样式都是datagrid里属性的样式
注意 第一次的时候我没有给 datagrid设置key;
在需要样式的窗体中 我是这么写的
但是我想到, 引入了这个全局样式以后 这个窗体里的所有datagrid都有这个全局样式,但是如果我有的datagrid想自己设计样式 该怎么做?
自己试了挺多种方式,但是最后发现制定style的key就好 在引入这个资源以后,这个style就会加载到窗体中;代码提示也会有
而且可以在一个datagrid的全局样式中设置不同的style,根据场景选择满足情况的style;(比如style1的背景是红色,style2的背景为蓝色... 这样的样式都可写在这一个全局文件中)
四:DataGrid设置滚动条
<DataGrid Width="{Binding ElementName=ShangHai, Path=Width}" RowHeaderWidth="0" Style="{StaticResource dataGridGrayStyle}">
<ColumnDefinition Width="500" /><!-- 这里设置宽度,即可出现滚动条 -->
<DataGrid.Columns>
<DataGridTextColumn Width="150" Header="名称" />
<DataGridTextColumn Width="90" Header="现价" />
<DataGridTextColumn Width="90" Header="涨幅" />
<DataGridTextColumn Width="90" Header="涨跌" />
<DataGridTextColumn Width="90" Header="持仓" />
<DataGridTextColumn Width="90" Header="日增仓" />
<DataGridTextColumn Width="90" Header="成交额" />
<DataGridTextColumn Width="90" Header="总手" />
</DataGrid.Columns>
</DataGrid>
另外就是DataGrid不要放在StackPanel中,StackPanel在垂直和水平方向会无限放大,从而不会出现滚动条。
五:一个窗体中加载多个datagrid时 数据量不大但是依旧卡顿
如图,我实在一个窗体中存放了六个datagrid,但是在切换页面时,发现窗体卡顿,通过调试,发现DataGridCell加载速度很慢;
因为datagrid是我自己设置的全局样式,我在datagrid的DataGridCell样式里进行了如下设置
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Grid Background="Transparent">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
我将原来的ContentPresenter改成了TextBlock;
并且设置了(这里没有感觉到发挥很大的作用)
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
WPF DataGrid渲染速度很慢 -Java 学习之路 (javaroad.cn)
六:datagrid选中行失去焦点后样式发生改变
在datagridcell中设置如下触发器
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="White" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="White" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}" />
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</Style.Triggers>