假设一个应用程序中,某个窗口需要使用样式,但是样式非常多,写在一个窗口中代码分类不方便。最好Style写在专门的xaml文件中,然后引用到窗口中,就像HTML引用外部css文件一样。 实现方法: 1.创建新建项添加/资源字典Style.xaml,并添加Style样式 Code: ResourceDictionaryxmlns= http://schemas.microsoft.com/winfx/20
假设一个应用程序中,某个窗口需要使用样式,但是样式非常多,写在一个窗口中代码分类不方便。最好Style写在专门的xaml文件中,然后引用到窗口中,就像HTML引用外部css文件一样。
实现方法:
1.创建新建项“添加/资源字典”Style.xaml,并添加Style样式
Code:
<
ResourceDictionary xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml">
< Style x:Key= "BaseStyle" TargetType= "{x:Type Control}">
< Setter Property= "Margin" Value= "5" />
< /Style>
< Style TargetType= "{x:Type Button}" BasedOn= "{StaticResource BaseStyle}">
< Setter Property= "Width" Value= "80" />
< Setter Property= "Height" Value= "27" />
< /Style>
< Style TargetType= "{x:Type GroupBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type TextBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type CheckBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type ListBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type ProgressBar}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type TextBlock}" >
< Setter Property= "Margin" Value= "5" />
< /Style>
< /ResourceDictionary>
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml">
< Style x:Key= "BaseStyle" TargetType= "{x:Type Control}">
< Setter Property= "Margin" Value= "5" />
< /Style>
< Style TargetType= "{x:Type Button}" BasedOn= "{StaticResource BaseStyle}">
< Setter Property= "Width" Value= "80" />
< Setter Property= "Height" Value= "27" />
< /Style>
< Style TargetType= "{x:Type GroupBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type TextBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type CheckBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type ListBox}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type ProgressBar}" BasedOn= "{StaticResource BaseStyle}">
< /Style>
< Style TargetType= "{x:Type TextBlock}" >
< Setter Property= "Margin" Value= "5" />
< /Style>
< /ResourceDictionary>
2.在窗口中引用外部资源,注意:在Window中添加外部样式需要指定key,而Application中则不需要,所以这里rdStyle就是引用外部样式Style.xaml的key
Code:
<
Window x:Class=
"MSSQLDocCreator.MainWindow"
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425" WindowStartupLocation= "CenterScreen">
< Window.Resources>
< ResourceDictionary x:Key= "rdStyle">
< ResourceDictionary.MergedDictionaries>
< ResourceDictionary Source= "Style.xaml" />
< /ResourceDictionary.MergedDictionaries>
< /ResourceDictionary>
< /Window.Resources>
....
< /Window>
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425" WindowStartupLocation= "CenterScreen">
< Window.Resources>
< ResourceDictionary x:Key= "rdStyle">
< ResourceDictionary.MergedDictionaries>
< ResourceDictionary Source= "Style.xaml" />
< /ResourceDictionary.MergedDictionaries>
< /ResourceDictionary>
< /Window.Resources>
....
< /Window>
3.将样式应用到窗口的布局上
Code:
<
Window x:Class=
"MSSQLDocCreator.MainWindow"
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425" WindowStartupLocation= "CenterScreen">
< Window.Resources>
...
< /Window.Resources>
< Grid Resources= "{StaticResource rdStyle}">
...
< /Grid>
< /Window>
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425" WindowStartupLocation= "CenterScreen">
< Window.Resources>
...
< /Window.Resources>
< Grid Resources= "{StaticResource rdStyle}">
...
< /Grid>
< /Window>
见效果图:
完整MainWindow.xaml
Code:
<
Window x:Class=
"MSSQLDocCreator.MainWindow"
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425"
WindowStartupLocation= "CenterScreen">
< Window.Resources>
< ObjectDataProvider x:Key= "bndOutputFeilds"
ObjectType= "{x:Type local:AppHelper}" MethodName= "GetDocFields" />
< ResourceDictionary x:Key= "rdStyle">
< ResourceDictionary.MergedDictionaries>
< ResourceDictionary Source= "Style.xaml" />
< /ResourceDictionary.MergedDictionaries>
< /ResourceDictionary>
< /Window.Resources>
< Grid Resources= "{StaticResource rdStyle}">
< Grid.RowDefinitions>
< RowDefinition Height= "Auto" />
< RowDefinition />
< RowDefinition Height= "Auto" />
< RowDefinition Height= "Auto" />
< /Grid.RowDefinitions>
< GroupBox Grid.Row= "0" Header= "MSSQL ConnectionString">
< StackPanel Orientation= "Vertical">
< TextBox Name= "txtConnectionString"
VerticalScrollBarVisibility= "Visible"
TextWrapping= "Wrap" Height= "58" />
< StackPanel Orientation= "Horizontal">
< Button Name= "txtTestConnect" Content= "Test" />
< Button Name= "txtConnect" Content= "Connect" />
< /StackPanel>
< /StackPanel>
< /GroupBox>
< GroupBox Grid.Row= "1" Header= "Output options">
< Grid>
< Grid.RowDefinitions>
< RowDefinition Height= "Auto" />
< RowDefinition />
< RowDefinition Height= "Auto" />
< /Grid.RowDefinitions>
< Grid.ColumnDefinitions>
< ColumnDefinition />
< ColumnDefinition />
< /Grid.ColumnDefinitions>
< TextBlock Grid.Row= "0" Grid.Column= "0" Text= "Tables and Views" />
< TextBlock Grid.Row= "0" Grid.Column= "1" Text= "Output fields" />
< ListBox Grid.Row= "1" Grid.Column= "0" />
< ListBox Name= "lstFields" Grid.Row= "1" Grid.Column= "1"
DataContext= "{StaticResource bndOutputFeilds}"
ItemsSource= "{Binding}" IsSynchronizedWithCurrentItem= "True">
< ListBox.ItemTemplate>
< DataTemplate>
< StackPanel Orientation= "Horizontal" >
< CheckBox IsChecked= "{Binding Path=IsSelected}"
Click= "chkSomeFiels_Click" />
< TextBlock Text= "{Binding Path=FieldName}"
VerticalAlignment= "Center" />
< /StackPanel>
< /DataTemplate>
< /ListBox.ItemTemplate>
< /ListBox>
< CheckBox Name= "chkObjectsAll" IsThreeState= "True"
Grid.Row= "2" Grid.Column= "0" Content= "Select All" />
< CheckBox Name= "chkFieldsAll" IsThreeState= "True"
Grid.Row= "2" Grid.Column= "1" Content= "Select All" IsChecked= "True"
Click= "CheckBox_Click" />
< /Grid>
< /GroupBox>
< ProgressBar Height= "20" Grid.Row= "2" />
< StackPanel Grid.Row= "3" HorizontalAlignment= "Left">
< Button Content= "Create" />
< /StackPanel>
< /Grid>
< /Window>
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local= "clr-namespace:MSSQLDocCreator"
Title= "MainWindow" Height= "602" Width= "425"
WindowStartupLocation= "CenterScreen">
< Window.Resources>
< ObjectDataProvider x:Key= "bndOutputFeilds"
ObjectType= "{x:Type local:AppHelper}" MethodName= "GetDocFields" />
< ResourceDictionary x:Key= "rdStyle">
< ResourceDictionary.MergedDictionaries>
< ResourceDictionary Source= "Style.xaml" />
< /ResourceDictionary.MergedDictionaries>
< /ResourceDictionary>
< /Window.Resources>
< Grid Resources= "{StaticResource rdStyle}">
< Grid.RowDefinitions>
< RowDefinition Height= "Auto" />
< RowDefinition />
< RowDefinition Height= "Auto" />
< RowDefinition Height= "Auto" />
< /Grid.RowDefinitions>
< GroupBox Grid.Row= "0" Header= "MSSQL ConnectionString">
< StackPanel Orientation= "Vertical">
< TextBox Name= "txtConnectionString"
VerticalScrollBarVisibility= "Visible"
TextWrapping= "Wrap" Height= "58" />
< StackPanel Orientation= "Horizontal">
< Button Name= "txtTestConnect" Content= "Test" />
< Button Name= "txtConnect" Content= "Connect" />
< /StackPanel>
< /StackPanel>
< /GroupBox>
< GroupBox Grid.Row= "1" Header= "Output options">
< Grid>
< Grid.RowDefinitions>
< RowDefinition Height= "Auto" />
< RowDefinition />
< RowDefinition Height= "Auto" />
< /Grid.RowDefinitions>
< Grid.ColumnDefinitions>
< ColumnDefinition />
< ColumnDefinition />
< /Grid.ColumnDefinitions>
< TextBlock Grid.Row= "0" Grid.Column= "0" Text= "Tables and Views" />
< TextBlock Grid.Row= "0" Grid.Column= "1" Text= "Output fields" />
< ListBox Grid.Row= "1" Grid.Column= "0" />
< ListBox Name= "lstFields" Grid.Row= "1" Grid.Column= "1"
DataContext= "{StaticResource bndOutputFeilds}"
ItemsSource= "{Binding}" IsSynchronizedWithCurrentItem= "True">
< ListBox.ItemTemplate>
< DataTemplate>
< StackPanel Orientation= "Horizontal" >
< CheckBox IsChecked= "{Binding Path=IsSelected}"
Click= "chkSomeFiels_Click" />
< TextBlock Text= "{Binding Path=FieldName}"
VerticalAlignment= "Center" />
< /StackPanel>
< /DataTemplate>
< /ListBox.ItemTemplate>
< /ListBox>
< CheckBox Name= "chkObjectsAll" IsThreeState= "True"
Grid.Row= "2" Grid.Column= "0" Content= "Select All" />
< CheckBox Name= "chkFieldsAll" IsThreeState= "True"
Grid.Row= "2" Grid.Column= "1" Content= "Select All" IsChecked= "True"
Click= "CheckBox_Click" />
< /Grid>
< /GroupBox>
< ProgressBar Height= "20" Grid.Row= "2" />
< StackPanel Grid.Row= "3" HorizontalAlignment= "Left">
< Button Content= "Create" />
< /StackPanel>
< /Grid>
< /Window>
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace MSSQLDocCreator {
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
/// <summary>
/// Field全选
/// </summary>
private void CheckBox_Click( object sender, RoutedEventArgs e) {
ObjectDataProvider provider = (ObjectDataProvider) this.FindResource( "bndOutputFeilds");
List<DocField> fields = provider.Data as List<DocField>;
foreach (DocField field in fields) {
field.IsSelected = ((CheckBox)sender).IsChecked.Value;
}
}
private void chkSomeFiels_Click( object sender, RoutedEventArgs e) {
CheckSelectedFields();
}
private void CheckSelectedFields() {
ObjectDataProvider provider = (ObjectDataProvider) this.FindResource( "bndOutputFeilds");
List<DocField> fields = provider.Data as List<DocField>;
int checkedCount = fields.Where(c => c.IsSelected).Count();
if (checkedCount == 0) {
chkFieldsAll.IsChecked = false;
} else if (checkedCount == fields.Count) {
chkFieldsAll.IsChecked = true;
} else {
chkFieldsAll.IsChecked = null;
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace MSSQLDocCreator {
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
/// <summary>
/// Field全选
/// </summary>
private void CheckBox_Click( object sender, RoutedEventArgs e) {
ObjectDataProvider provider = (ObjectDataProvider) this.FindResource( "bndOutputFeilds");
List<DocField> fields = provider.Data as List<DocField>;
foreach (DocField field in fields) {
field.IsSelected = ((CheckBox)sender).IsChecked.Value;
}
}
private void chkSomeFiels_Click( object sender, RoutedEventArgs e) {
CheckSelectedFields();
}
private void CheckSelectedFields() {
ObjectDataProvider provider = (ObjectDataProvider) this.FindResource( "bndOutputFeilds");
List<DocField> fields = provider.Data as List<DocField>;
int checkedCount = fields.Where(c => c.IsSelected).Count();
if (checkedCount == 0) {
chkFieldsAll.IsChecked = false;
} else if (checkedCount == fields.Count) {
chkFieldsAll.IsChecked = true;
} else {
chkFieldsAll.IsChecked = null;
}
}
}