Chapter4:Using Standard Control(学习)

ContentControl

<Button>,<ScrollViewer>,<Label>,<CheckBox>,<RadioButton>,<ToolTip>

1:ContentControl class 有一个类型是object的Content属性,可以是任何东西。eg:button控件的content可以是任何形式的element:(text,text+image, image)和一个ContentTemplate属性可以接收DataTemplate类型的控件。

2:ContentControl的Content属性可以隐式的表达

View Code
<Button Margin="4" HorizontalAlignment="Left" Padding="4">

            <StackPanel Orientation="Horizontal">

                <Image Source="copy.png" Width="16" Height="16"/>

                <TextBlock Text="Copy" Margin="10,0,0,0"

                           VerticalAlignment="Center" FontSize="16"/>                       

            </StackPanel>

        </Button>

也可以显式的表达

View Code
<Button Content="{StaticResource p1}" FontSize="16"

                Margin="4" Padding="4" HorizontalAlignment="Left"/>

3:有关ContentControl的Content属性设置规则

  • Content属性如果是string,textblock会被render,textblock的text属性为这个string
  • Content属性如果隐式表达(不写Content属性直接夹在<Button>...</Button>中间)的是一个UIElement object,则该UIElement被render,如果是一行的UIElement(<Image>)则外面什么都不加,如果是多行(<Image>+<TextBlock>)则外面要加一个panel(<Grid>,<StackPanel>,<Border>)
  • 如果ContentTemplate属性是null的话,Content属性是自定义Object的话,则被渲染成TextBlock with its Text属性 set to the ToString方法 of the Content属性值(object类型), otherwise DataTempate被应用
  • 注意:各类属性不一定只在xaml中才可以设置,也可以在后台.cs中设置,具体在哪里要灵活使用。但如果是在后台设置一个ContentControlContent属性,则首先要给ContentControl定义一个x:Name="?",然后后台便可以

    View Code

 

Headered ContentControl:<GroupBox>

1:继承自ContentControl,除了已有的Content和ContentTemplate属性外,还多了两个属性(Header type of objectHeaderTemplate type of DataTemplate),4个属性都遵从上面的属性设置规则。

?.Content = ?.Header = new Book {

                Name = "Windows Internals",

                Author = "Mark Russinovich",

                YearPublished = 2009

            };

        }

ItemsControl

这里包括了很多类,我们着重看Selector类

Selector类

1:Items属性:一组object,比较ContentControl的Content属性(一个Object)

2:一些重要的属性:SelectedIndex, SelectedItem, SelectionChanged, SelectedValue & SlectedValuePath

3:SelectedValue & SlectedValuePath: 如果Selector当前hold的是person objects并且SlectedValuePath=Name, SelectedValue是当前选中的Person的Name

 

ListBox: 继承自Selector类

1:另外有的属性包括:

SelectionMode = Single, Multiple, Extended

SelectedItems

SelectionChanged

2:ListBox的Wrapper<ListBoxItem>(ContentControl)

ComboBox: 继承自Selector类

1:ComboBox的Wrapper<ComboBoxItem>(ContentControl):对于each object added into ListBox/ComboBox时这些wrapper会自动加载

2:<ComboBoxItem>ContentControl类型,代表可以使用DataTemplate类型创建任意类型的ContentControl

两种方法实现:

  • 手动增加每一行ComboBoxItem
View Code
 1 <Window x:Class="CH04.Lists2.MainWindow"

 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 4         Title="MainWindow" Height="350" Width="525">

 5     <Grid>

 6         <Grid.RowDefinitions>

 7             <RowDefinition Height="Auto" />

 8             <RowDefinition />

 9         </Grid.RowDefinitions>

10         <ComboBox Margin="4" x:Name="_langCombo" HorizontalContentAlignment="Stretch" 

11                   SelectionChanged="OnLanguageChanged">

12             <ComboBoxItem Padding="4">

13                 <StackPanel Orientation="Horizontal">

14                     <Image Source="Images/C++2.jpg" Width="32" Stretch="Uniform" />

15                     <TextBlock Text="C++" VerticalAlignment="Center" FontSize="20" Margin="10,0,0,0" />

16                 </StackPanel>

17             </ComboBoxItem>

18             <ComboBoxItem Padding="4">

19                 <StackPanel Orientation="Horizontal" >

20                     <Image Source="Images/CS.jpg" Width="32" Stretch="Uniform" />

21                     <TextBlock Text="C#" VerticalAlignment="Center" FontSize="20" Margin="10,0,0,0" />

22                 </StackPanel>

23             </ComboBoxItem>

24             <ComboBoxItem Padding="4">

25                 <StackPanel Orientation="Horizontal" >

26                     <Image Source="Images/VB2.jpg" Width="32" Stretch="Uniform" />

27                     <TextBlock Text="Visual Basic" VerticalAlignment="Center" FontSize="20" Margin="10,0,0,0" />

28                 </StackPanel>

29             </ComboBoxItem>

30             <ComboBoxItem Padding="4">

31                 <StackPanel Orientation="Horizontal" >

32                     <Image Source="Images/FS.jpg" Width="32" Stretch="Uniform" />

33                     <TextBlock Text="F#" VerticalAlignment="Center" FontSize="20" Margin="10,0,0,0" />

34                 </StackPanel>

35             </ComboBoxItem>

36         </ComboBox>

37         <GroupBox Header="Some Keywords" Grid.Row="1" Margin="4">

38             <ListBox x:Name="_keywordList" Margin="4">

39             </ListBox>

40         </GroupBox>

41     </Grid>

42 </Window>
  • 自动增加具有一定DataTemplate格式的data objects

 

 


 

Display Image

1:<Image>Tag需要Source属性(ImageSource类型,是Image的具体Data)指定一个url(string类型:xxx.png)文件,能从一个string类型变为ImageSource类型(Image的具体Data),原因是type converter从这段string类型转变成一个BitmapImage(派生自ImageSource类)

2:Stretch属性:

Stretch=Uniform(Default):保持图像比例,但是会缩小在<Image>所设置的width,height里

Stretch=UniformToFill:保持图像比例并且尽量多的占据生育空间,但是多余<Image>所设置的width,height的图像会被切掉

Stretch=None:保留原图像大小多余被切掉,用ScrollViewer可以Scroll着看

Stretch=Fill:改变尺寸比例,只是为了把图像充满<Image>所设置的width,height里

3: ImageSource类有三种派生类可以用(D3DImage,DrawingImage(一些2d drawing实例:<GeometryDrawing>),BitmapSource)

Drawing:

如何创建一个Drawing

 

View Code
<Window x:Class="CH04.ImageSources.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Image Sources" Height="350" Width="525">

    <Window.Resources>

        <CombinedGeometry x:Key="ringGeometry" GeometryCombineMode="Exclude">

            <CombinedGeometry.Geometry1>

                <EllipseGeometry Center="100,100" RadiusX="100" RadiusY="100" />

            </CombinedGeometry.Geometry1>

            <CombinedGeometry.Geometry2>

                <EllipseGeometry Center="100,100" RadiusX="80" RadiusY="80" />

            </CombinedGeometry.Geometry2>

        </CombinedGeometry>

        <GeometryDrawing x:Key="ringDrawing"

            Geometry="{StaticResource ringGeometry}"

            Brush="LightBlue">

            <GeometryDrawing.Pen>

                <Pen Brush="Black" Thickness="3" />

            </GeometryDrawing.Pen>

        </GeometryDrawing>

    </Window.Resources>

    <UniformGrid Rows="1" Columns="2">

        <Image>

            <Image.Source>

                <DrawingImage Drawing="{StaticResource ringDrawing}" />

            </Image.Source>

        </Image>

        <Image x:Name="_image">

        </Image>

    </UniformGrid>

</Window>

 

 

Drawing不是element,不可以直接放在visual tree里,但是可以放在<Image>Source属性里

BitmapSource:

其本身就是一个抽象类,里面又包含很多类,其中一个是WriteableBitmap

 

 


ToolTip

ToolTip可以custmoze


 

 

 

WPF中.cs file中定义的类没有加public可以被同一个porject下的其他.cs或者 .xaml调用,但是记得xaml下要加入project的ns。

xaml可以简单的创建类的实例并赋值属性,一边xaml里随意使用创建好的实例

View Code
class Person

    {

        public int Age { get; set; }

        public string Name { get; set; }

        public override string ToString()

        {

            return string.Format("{0} is {1} years old", Name, Age);

        }

    }
<local:Person Age="10" Name="Bart" x:Key="p1"/>

 xaml中如何StringFormat

View Code
<TextBlock Text="{Binding Name, StringFormat=Name: {0}}" />

                            <TextBlock Text="{Binding Author, StringFormat=Author: {0}}" />

                            <TextBlock Text="{Binding YearPublished, StringFormat=Published: {0}}" />

 

你可能感兴趣的:(apt)