WPF中遇到的问题

刚刚接触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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值