当前位置:   article > 正文

WPF-基础及进阶扩展合集(持续更新)_wpf 中文扩展

wpf 中文扩展

目录

一、基础

1、GridSplitter分割线

2、x:static访问资源文件

3、wpf触发器

4、添加xaml资源文件

5、Convert转换器

6、多路绑定与多路转换器

二、进阶扩展

1、HierarchicalDataTemplate

2、XmlDataProvider从外部文件获取源

3、TextBox在CellTemplate中的焦点问题

4、让窗体可裁减

5、ScrollViewer自动滚动到尾部

6、wpf的Behavior行为

7、导航、Page、Hyperlink

8、Cursor光标属性

9、ListView布局、滚动条

10、DataGrid文本过长换行

11、指定字体集FontFamily

12、窗体可拖动


一、基础

 了解更多控件介绍请点击:官方文档查询

1、GridSplitter分割线

将分割线加入Grid某行或某列,用户即可通过拖拽改变行或列的尺寸。

 垂直拖拽,示例:

  1. <Grid>
  2. <Grid.RowDefinitions>
  3. <RowDefinition Height="*" />
  4. <RowDefinition Height="3" />
  5. <RowDefinition Height="*" />
  6. </Grid.RowDefinitions>
  7. <hc:TextBox Background="LightGray" />
  8. <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" />
  9. <hc:TextBox Grid.Row="2" Background="LightBlue" />
  10. </Grid>

水平拖拽 ,示例:

  1. <Grid>
  2. <Grid.ColumnDefinitions>
  3. <ColumnDefinition Width="*"/>
  4. <ColumnDefinition Width="3"/>
  5. <ColumnDefinition Width="*"/>
  6. </Grid.ColumnDefinitions>
  7. <hc:TextBox Background="LightGray" />
  8. <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
  9. <hc:TextBox Grid.Column="2" Background="LightBlue" />
  10. </Grid>

2、x:static访问资源文件

 注意:资源文件访问权限须更改为Public

  1. <TextBlock x:Name="tBk"
  2. Height="50"
  3. Background="LemonChiffon"
  4. Text="{x:Static prop:Resources.Gear}" />


3、wpf触发器

三类型:  属性触发器、数据触发器、事件触发器

使用场景:

        样式:Style.Triggers

        数据模板:DataTemplate.Triggers

        控件模板:ControlTemplate.Triggers

        元素中定义触发器:FrameworkElement.Triggers  //仅支持事件触发器,否则报错

  1. <Style TargetType="Button">
  2. <Setter Property="Background" Value="Gray" />
  3. <Setter Property="Template">
  4. <Setter.Value>
  5. <ControlTemplate TargetType="Button">
  6. <Border Background="{TemplateBinding Background}"
  7. BorderBrush="Black"
  8. BorderThickness="1">
  9. <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
  10. </Border>
  11. <ControlTemplate.Triggers>
  12. <Trigger Property="IsMouseOver" Value="true">
  13. <Setter Property="Background" Value="LightGreen" />
  14. </Trigger>
  15. </ControlTemplate.Triggers>
  16. </ControlTemplate>
  17. </Setter.Value>
  18. </Setter>
  19. </Style>

4、添加xaml资源文件

pack://application:,,,  可省略 

  1. <Application.Resources>
  2. <ResourceDictionary>
  3. <ResourceDictionary.MergedDictionaries>
  4. <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" />
  5. <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" />
  6. </ResourceDictionary.MergedDictionaries>
  7. </ResourceDictionary>
  8. </Application.Resources>

5、Convert转换器

①继承IValueConverter接口(Convert方向为Source->Target,ConvertBack反向)实现一个转换器,示例如下:

  1. public class BoolToColorConvert : IValueConverter
  2. {
  3. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  4. {
  5. if (value is true) return Brushes.LightBlue;
  6. else return Brushes.LightGreen;
  7. }
  8. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  9. {
  10. throw new NotImplementedException();
  11. }
  12. }

②新建一个转换器资源对象,与Binding绑定,如下:

  1. <Grid.Resources>
  2. <convert:BoolToColorConvert x:Key="myconv"/>
  3. </Grid.Resources>
  4. <TextBox Background="{Binding IsCheck,Converter={StaticResource myconv}}" Text="{Binding IsCheck}" />

6、多路绑定与多路转换器

注意:MultiBinding必须实现转换器

实现IMultiValueConverter接口的多路转换器,示例如下:

  1. public class MultiConvert : IMultiValueConverter
  2. {
  3. public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  4. {
  5. var high = values[0].ToString();
  6. if (values[1] is true)
  7. return $"{high} true";
  8. else return $"{high} false";
  9. }
  10. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  11. {
  12. throw new NotImplementedException();
  13. }
  14. }
  1. <Grid.Resources>
  2. <convert:MultiConvert x:Key="mconv" />
  3. </Grid.Resources>
  4. <hc:TextBox>
  5. <hc:TextBox.Text>
  6. <MultiBinding Converter="{StaticResource mconv}">
  7. <Binding ElementName="tbox" Path="Width" />
  8. <Binding Path="IsCheck" />
  9. </MultiBinding>
  10. </hc:TextBox.Text>
  11. </hc:TextBox>


二、进阶扩展

1、HierarchicalDataTemplate

HierarchicalDataTemplate:助层级控件(TreeView、MenuItem)显示层级数据模板

     注意:若结点为同类型(同节点名、同属性名),使用一个Template就行,会自动迭代;

                可通过路由事件方式取出XML数据;

  1. <Window.Resources>
  2. <XmlDataProvider x:Key="xdp" XPath="School">
  3. <x:XData>
  4. <School xmlns="" Name="魔法学院">
  5. <Grade Name="一年级">
  6. <Class Name="一班" />
  7. <Class Name="二班" />
  8. </Grade>
  9. <Grade Name="二年级">
  10. <Class Name="一班" />
  11. <Class Name="二班" />
  12. </Grade>
  13. </School>
  14. </x:XData>
  15. </XmlDataProvider>
  16. <HierarchicalDataTemplate DataType="School" ItemsSource="{Binding XPath=Grade}">
  17. <TextBlock Text="{Binding XPath=@Name}" />
  18. </HierarchicalDataTemplate>
  19. <HierarchicalDataTemplate DataType="Grade" ItemsSource="{Binding XPath=Class}">
  20. <RadioButton Content="{Binding XPath=@Name}" GroupName="gp" />
  21. </HierarchicalDataTemplate>
  22. <HierarchicalDataTemplate DataType="Class">
  23. <CheckBox Content="{Binding XPath=@Name}" IsThreeState="True" />
  24. </HierarchicalDataTemplate>
  25. </Window.Resources>

2、XmlDataProvider从外部文件获取源

 代码如下:

  1. <Grid.Resources>
  2. <XmlDataProvider x:Key="xmldata"
  3. Source="Xml/mydata.xml"
  4. XPath="ArrayOfJsonTest" />
  5. </Grid.Resources>
  6. <ListBox Height="80"
  7. d:ItemsSource="{d:SampleData ItemCount=3}"
  8. Background="LightYellow"
  9. BorderBrush="DarkOrange"
  10. BorderThickness="3"
  11. ItemsSource="{Binding Source={StaticResource xmldata}, XPath=JsonTest}">
  12. <ListBox.ItemTemplate>
  13. <DataTemplate>
  14. <Border BorderBrush="DarkOrchid" BorderThickness="3">
  15. <StackPanel Width="200"
  16. Height="30"
  17. Orientation="Horizontal">
  18. <TextBlock Width="NaN"
  19. Margin="5"
  20. Text="{Binding XPath=Name}" />
  21. <TextBlock Width="NaN"
  22. Margin="5"
  23. Text="{Binding XPath=Value}" />
  24. <TextBlock Width="NaN"
  25. Margin="5"
  26. Text="{Binding XPath=Id}" />
  27. </StackPanel>
  28. </Border>
  29. </DataTemplate>
  30. </ListBox.ItemTemplate>
  31. </ListBox>

3、TextBox在CellTemplate中的焦点问题

当使用GridView作为ListView的View属性时,若某一列使用TextBox作为CellTemplate,那么TextBox获取焦点时目标控件并不会把该项作为SelectedItem

解决方式:通过TextBox的GotFocus事件的事件处理器去追溯到目标控件,获取业务逻辑数据,并将其设置为选中项;

/*********访问业务逻辑数据***************/

TextBox tb=e.OriginalSource as TextBox;//获取事件发起的源头

ContentPresenter cp=tb.TemplateParent as ContentPresenter;//获取模板目标

Student stu=cp.Content as Student;//获取业务逻辑数据

this.listViewStudent.SelectedItem=stu;//设置ListView的选中项

/****************访问界面元素*************************/

ListViewItem lvi=this.listViewStudent.

                itemContainerGenerator.ContainerFromItem(stu) as ListViewItem;//通过条目容器自上而下寻找

CheckBox chb=this.FindVisualChild<CheckBox>(lvi);//借助VisualTreeHelper封装的方法

MessageBox.Show(chb.Name);

注意:寻找DataTemplate生成的控件,若结构简单可使用DataTemplate对象的FindName方法,对于结构复杂的控件,只能借助VisualTreeHelper来实现了。 

4、让窗体可裁减

前提:窗体AllowsTransparency属性设为true

                  WindowStyle属性设为None

再使用Clip方法裁剪,指定一个裁剪路径

5、ScrollViewer自动滚动到尾部

通过ScrollChanged路由事件实现该功能:

  1. private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
  2. {
  3. var scrollViewer = (ScrollViewer)sender;
  4. // 检查是否已滚动到底部
  5. bool isAtBottom = scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight - 1;
  6. // 如果已滚动到底部,自动滚动到底部
  7. if (isAtBottom)
  8. {
  9. try
  10. {
  11. scrollViewer.ScrollToBottom();
  12. }
  13. catch
  14. {
  15. // ignored
  16. }
  17. }
  18. }

6、wpf的Behavior行为

引用System.Windows.Interactivity库

使用事件触发行为

  1. <Button Width="90"
  2. Height="90"
  3. Background="LightBlue"
  4. Content="Ok"
  5. FontSize="30" >
  6. <i:Interaction.Behaviors>
  7. <inter:MyBehavior/>
  8. </i:Interaction.Behaviors>
  9. </Button>
  1. public class MyBehavior:Behavior<Button>
  2. {
  3. protected override void OnAttached()
  4. {
  5. base.OnAttached();
  6. AssociatedObject.Click += AssociatedObject_Click;
  7. }
  8. private void AssociatedObject_Click(object sender, RoutedEventArgs e)
  9. {
  10. AssociatedObject.Background = Brushes.LightGreen;
  11. AssociatedObject.Content = "Green";
  12. }
  13. protected override void OnDetaching()
  14. {
  15. base.OnDetaching();
  16. AssociatedObject.Click-= AssociatedObject_Click;
  17. }
  18. }

导航:

1、NavigationService.GoBack();  //向下,使用前判断CanGoBack()

2、NavigationService.GoForward();  //向上,使用前判断CanGoForward()

3、NavigationService.Navigate(new Uri("Page3.xaml", UriKind.RelativeOrAbsolute));//导航

使用方法1:

  1. <TextBlock x:Name="tblk" Background="LightGray">
  2. <Hyperlink Click="Hyperlink_Click" NavigateUri="https://cn.bing.com">
  3. BiYin
  4. </Hyperlink>
  5. </TextBlock>
  1. private void Hyperlink_Click(object sender, RoutedEventArgs e)
  2. {
  3. Hyperlink hyperlink = (Hyperlink)sender;
  4. Process.Start(new ProcessStartInfo(hyperlink.NavigateUri.AbsoluteUri));
  5. //Process.Start(new ProcessStartInfo("https://www.csdn.net/"));
  6. }

使用2:结合Page使用

  1. <Frame x:Name="fram"
  2. Height="200"
  3. Source="Page1.xaml" />

this.fram.Navigate(new Uri("Page2.xaml", UriKind.RelativeOrAbsolute));

8、Cursor光标属性

FrameworkElement的属性,可设置控件区域光标的不同状态

9、ListView布局、滚动条

1、ItemsPanel:可设置数据项布局水平或垂直

2、ItemContainerStyle :设置每个项的样式,

                                BasedOn:继承指定对象

3、Template:可通过模板给无ScrollViewer功能的容器添加ScrollViewer

                1、ScrollViewer控件:封装了水平、垂直ScrollBar和一个内容容器

                2、ItemsPresenter:itemsControl不负责呈现控件,通过子元素ItemsPresenter负责,放在模板内部,该子元素会检测其父元素是否为集合控件,若是则添至视觉树中
————————————————

更详细点击:
    转到示例

10、DataGrid文本过长换行

通过Column的ElementStyle设置TextBlock的属性如下(注意:Width属性必须设置后才有效)

,该方法会多显示一行,如果太长仍不能显示全部:

  1. <DataGrid.Columns>
  2. <DataGridTextColumn Width="*"
  3. Binding="{Binding}"
  4. Header="Head1">
  5. <DataGridTextColumn.ElementStyle>
  6. <Style>
  7. <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
  8. <Setter Property="TextBlock.TextAlignment" Value="Left"/>
  9. </Style>
  10. </DataGridTextColumn.ElementStyle>
  11. </DataGridTextColumn>
  12. </DataGrid.Columns>

11、指定字体集FontFamily

①添加字体资源文件;

②双击字体文件可查看字体名称;

③指定字体集;

  1. <TextBlock Height="NaN"
  2. Margin="5"
  3. FontFamily="./Fonts/#Algerian"
  4. FontSize="40"
  5. Text="My Test" />

12、窗体可拖动

  1. <Border Grid.ColumnSpan="2"
  2. Background="Transparent"
  3. ClipToBounds="True"
  4. CornerRadius="5 5 0 0"
  5. MouseLeftButtonDown="Top_MouseLeftButtonDown">
  6. </Border>
  1. private void Top_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  2. {
  3. if (e.LeftButton == MouseButtonState.Pressed) DragMove();
  4. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/360280
推荐阅读
相关标签
  

闽ICP备14008679号