精华内容
下载资源
问答
  • 在需要用到进度条显示后台运算进度的时候,如果同时进行算法运算以及界面进度条显示的话,那往往是算法计算结束了进度条才显示走条,无法同时进行,如果用到BackgroundWorker的话,就可以完美解决这个问题。
  • WPF(三)举例讲解WPF样式

    千次阅读 2010-05-26 15:15:00
    WPF(三)举例讲解WPF样式WPF学习 一: Creating a Style Object 创建样式TargetType:控件Property:属性 Value:值 二:Setting Properties 设置属性例如设置Button背景为红色: 三:Attaching Event Handlers ...

    WPF(三)举例讲解WPF样式

    WPF学习

     

    一: Creating a Style Object 创建样式

    <Style TargetType="…">

    <Setter Property="…" Value="…" />

    </Style>

    TargetType:控件

    Property:属性

    Value:值

     

    二:Setting Properties 设置属性

    例如设置Button背景为红色:

    <Style TargetType="Button">

    <Setter Property="Background" Value="Red" />

    </Style>

     

    三:Attaching Event Handlers 事件处理

    举例处理程序的theMouseEnterMouseLeave事件

    <Style x:Key="MouseOverHighlightStyle">

    <EventSetter Event="TextBlock.MouseEnter" Handler="element_MouseEnter" />

    <EventSetter Event="TextBlock.MouseLeave" Handler="element_MouseLeave" />

    <Setter Property="TextBlock.Padding" Value="5"/>

    </Style>

    Event:事件名称

    Handler:事件方法

     

    以下为该事件后台代码:

    private void element_MouseEnter(object sender, MouseEventArgs e)

    {

    ((TextBlock)sender).Background = new

    SolidColorBrush(Colors.LightGoldenrodYellow);

    }

    private void element_MouseLeave(object sender, MouseEventArgs e)

    {

    ((TextBlock)sender).Background = null;

    }

     

    四:The Many Layers of Styles 多种样式

    <Window.Resources>

            <Style x:Key="BigFontButtonStyle">

                <Setter Property="Control.FontFamily" Value="Times New Roman" />

                <Setter Property="Control.FontSize" Value="18" />

                <Setter Property="Control.FontWeight" Value="Bold" />

            </Style>

            <Style x:Key="EmphasizedBigFontButtonStyle" BasedOn="{StaticResource BigFontButtonStyle}">

                <Setter Property="Control.Foreground" Value="White" />

                <Setter Property="Control.Background" Value="DarkBlue" />

            </Style>

    </Window.Resources>

    里面设置了两个Style,用x:Key=""定义了样式的名字,BasedOn="{StaticResource BigFontButtonStyle}">表示继承了样式BigFontButtonStyleBasedOn是继承

     

    五:Automatically Applying Styles by Type 自动样式类型(你设置个Button的样式,你的所有Button都这个样式了,除非你给Button指定样式)

        <Window.Resources>

            <Style TargetType="Button">

                <Setter Property="FontFamily" Value="Times New Roman" />

                <Setter Property="FontSize" Value="18" />

                <Setter Property="FontWeight" Value="Bold" />

            </Style>

        </Window.Resources>

        <StackPanel Margin="5">

            <Button Padding="5" Margin="5">Customized Button</Button>

            <TextBlock Margin="5">Normal Content.</TextBlock>

            <Button Padding="5" Margin="5" Style="{x:Null}">A Normal Button</Button>

            <TextBlock Margin="5">More normal Content.</TextBlock>

            <Button Padding="5" Margin="5">Another Customized Button</Button>

    </StackPanel>

    第二个Button指定的样式,将不会采用设置的样式:<Button Padding="5" Margin="5" Style="{x:Null}">A Normal Button</Button>

    Style="{x:Null}" :指定样式

     

    六:Triggers 触发器

    Name

    Description

    Trigger

    This is the simplest form of trigger. It watches for a change in a dependency

    property and then uses a setter to change the style.

    MultiTrigger

    This is similar to trigger but combines multiple conditions. All the conditions

    must be met before the trigger springs into action.

    DataTrigger

    This trigger works with data binding. It’s similar to Trigger, except it watches

    for a change in any bound data

    MultiDataTrigger

    This combines multiple data triggers

    EventTrigger

    This is the most sophisticated trigger. It applies an animation when an event

    occurs

    (一)A Simple Trigger 一个简单的触发器

    <Style x:Key="BigFontButton">

                <Style.Setters>

                    <Setter Property="Control.FontFamily" Value="Times New Roman" />

                    <Setter Property="Control.FontSize" Value="18" />

                </Style.Setters>

                <Style.Triggers>

                    <Trigger Property="Control.IsFocused" Value="True">

                        <Setter Property="Control.Foreground" Value="DarkRed" />

                    </Trigger>

                </Style.Triggers>

            </Style>

    "Control.IsFocused= True "时,就Control.Foreground= DarkRed!哈哈,很容易理解吧!

     

    (二)An Event Trigger 事件触发器

    ...

            <EventTrigger RoutedEvent="Mouse.MouseLeave">

                <EventTrigger.Actions>

                    <BeginStoryboard>

                        <Storyboard>

                            <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="FontSize" />

                        </Storyboard>

                    </BeginStoryboard>

                </EventTrigger.Actions>

            </EventTrigger>

            </Style.Triggers>

            </Style>

    这个有点GIF的感觉,或者Flash也可以,我们一般用Blend来制作!其中代码会自动生成!不过对代码了解,修改起来比较方便!

     

     

    七 巩固(一)——多种样式的Button

    <!--声明了一个Style,它被声明在Window.Resources中说明它的有效范围是当前窗

        也可以放在APP里面,是哪个项目的APP,就作用于哪个项目-->

    <Window.Resources>

    <Style TargetType="Button" x:Key="ButtonStyle">

    <!--TargetType="Button" 指示该Style的作用对象是Button类的实例

        也就是说在当前窗体中的所有Button实例都将受到该Style的影响

    除非某Button有明确地指明它所使用的是另外的Style-->

    <!--定义的Style影响指定的Button对象而不是所有的Button对象

    Style添加一个x:Key="ButtonStyle"-->

                <Setter Property="Foreground"  Value="Blue" />

                <Setter Property="FontFamily " Value="CourierNew"/>

    <!--Setter是一个设置器,用来设置该Style要对TargetType的那些属性或对象进行设置

        我们这里设置的是ButtonForeground属性,将其值设置为Blue

        同理,我们将ButtonFontFamily属性设置为CourierNew-->

            </Style>

            <Style TargetType="Button" x:Key="TriggerButtonStyle" BasedOn="{StaticResource ButtonStyle}">

    <!--Style对外界的交互

        可以使用BaseOn来使一个Style“继承”另一个Style-->

                <Style.Triggers>

    <!--可以在Style中添加Trigger(触发器)-->

                    <Trigger  Property="IsPressed" Value="True">

                        <Setter Property="Foreground" Value="Red"/>

    <!--事件 按下BUTTON变红...影藏含义:Value="False"BUTTON还原-->

                    </Trigger>

                </Style.Triggers>

            </Style>

     </Window.Resources>

     

    使用样式!

    基本格式: Style="{StaticResource 样式名字}"

    比如:

    Style="{StaticResource ButtonStyle}"

    Style="{StaticResource TriggerButtonStyle}"

    举例:

    普通Button

    <Button Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1">normal button</Button>

    样式一Button x:Key="ButtonStyle"

    <Button Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="1" Style="{StaticResource ButtonStyle}">styled button</Button>

    样式二button x:Key="TriggerButtonStyle"

    <Button Grid.Column="2" Grid.ColumnSpan="1" Grid.Row="2" Grid.RowSpan="1" Style="{StaticResource TriggerButtonStyle}">trigger button</Button>

     

    七巩固()——漂亮的Button

    (1)    创建个项目Style,新建窗体BeautifulButton,顺便把自动生成的Windows1删除

    (2)    BeautifulButton导入以下代码

    <Window x:Class="Style.BeautifulButton"

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

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

        Title="BeautifulButton" Height="300" Width="300">

        <Grid Background="Black">

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="*"/>

                <ColumnDefinition Width="*"/>

                <ColumnDefinition Width="*"/>

            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>

                <RowDefinition Height="*"/>

                <RowDefinition Height="*"/>

                <RowDefinition Height="*"/>

            </Grid.RowDefinitions>

            <Button Grid.Column="0" Grid.Row="0" Height=" 25" Margin="10" Background="AliceBlue">1</Button>

            <Button Grid.Column="0" Grid.Row="1" Height=" 25" Margin="10" Background="Beige">2</Button>

            <Button Grid.Column="0" Grid.Row="2" Height=" 25" Margin="10" Background="CadetBlue">3</Button>

            <Button Grid.Column="1" Grid.Row="0" Height=" 25" Margin="10" Background="DarkBlue">4</Button>

            <Button Grid.Column="1" Grid.Row="1" Height=" 25" Margin="10" Background="Firebrick">5</Button>

            <Button Grid.Column="1" Grid.Row="2" Height=" 25" Margin="10" Background="Gainsboro">6</Button>

            <Button Grid.Column="2" Grid.Row="0" Height=" 25" Margin="10" Background="Honeydew">7</Button>

            <Button Grid.Column="2" Grid.Row="1" Height=" 25" Margin="10" Background="IndianRed">8</Button>

            <Button Grid.Column="2" Grid.Row="2" Height=" 25" Margin="10" Background="Khaki">9</Button>

        </Grid>

    </Window>

     

    (3)    APP导入以下代码

     

    <Application x:Class="Style.App"

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

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

        StartupUri="BeautifulButton.xaml">

        <Application.Resources>

             <!--定义按钮样式-->

            <Style TargetType="Button">

                <Setter Property="Foreground" Value="Black"/>

                <!--修改模板属性-->

                <Setter Property="Template">

                    <Setter.Value>

                        <!--控件模板-->

                        <ControlTemplate TargetType="Button">

                            <!--背景色-->

                            <Border x:Name="back" Opacity="0.8" CornerRadius="3">

                                <Border.BitmapEffect>

                                    <OuterGlowBitmapEffect Opacity="0.7" GlowSize="0" GlowColor="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(Button.Background).(SolidColorBrush.Color)}" />

                                </Border.BitmapEffect>

                                <Border.Background>

                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1.5">

                                        <GradientBrush.GradientStops>

                                            <GradientStopCollection>

                                                <GradientStop Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(Button.Background).(SolidColorBrush.Color)}" Offset="0"/>

                                                <GradientStop Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(Button.Background).(SolidColorBrush.Color)}" Offset="0.4"/>

                                                <GradientStop Color="#FFF" Offset="1"/>

                                            </GradientStopCollection>

                                        </GradientBrush.GradientStops>

                                    </LinearGradientBrush>

                                </Border.Background>

                                <!--前景色及边框-->

                                <Border x:Name="fore" BorderThickness="1" CornerRadius="3" BorderBrush="#5555">

                                    <Border.Background>

                                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

                                            <GradientBrush.GradientStops>

                                                <GradientStopCollection>

                                                    <GradientStop Color="#6FFF" Offset="0.5"/>

                                                    <GradientStop Color="#1111" Offset="0.51"/>

                                                </GradientStopCollection>

                                            </GradientBrush.GradientStops>

                                        </LinearGradientBrush>

                                    </Border.Background>

                                    <!--按钮内容-->

                                    <ContentPresenter x:Name="content" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{TemplateBinding  Content}">

                                        <ContentPresenter.BitmapEffect>

                                            <DropShadowBitmapEffect Color="#000" Direction="-90" ShadowDepth="2" Softness="0.1" Opacity="0.3" />

                                        </ContentPresenter.BitmapEffect>

                                    </ContentPresenter>

                                </Border>

                            </Border>

                            <!--触发器-->

                            <ControlTemplate.Triggers>

                                <!--鼠标移入移出-->

                                <Trigger Property="IsMouseOver" Value="True">

                                    <Trigger.EnterActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation To="6" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <ColorAnimation To="#AFFF" BeginTime="0:0:0.2" Duration="0:0:0.2" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation To="#3FFF" BeginTime="0:0:0.2" Duration="0:0:0.2" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.EnterActions>

                                    <Trigger.ExitActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.ExitActions>

                                </Trigger>

                                <!--按钮按下弹起-->

                                <Trigger Property="IsPressed" Value="True">

                                    <Trigger.EnterActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation To="3" Duration="0:0:0.1" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <ColorAnimation To="#3AAA" Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation To="#2111" Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.EnterActions>

                                    <Trigger.ExitActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.ExitActions>

                                </Trigger>

                                <!--按钮失效-->

                                <Trigger Property="IsEnabled" Value="False">

                                    <Setter Property="Foreground" Value="#B444"/>

                                    <Trigger.EnterActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation To="0" Duration="0:0:0.3" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <DoubleAnimation To="1" Duration="0:0:0.1" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)" />

                                                <DoubleAnimation To="-135" Duration="0:0:0.1" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)" />

                                                <ColorAnimation To="#FFF" Duration="0:0:0.3" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)" />

                                                <ColorAnimation To="#D555" Duration="0:0:0.3" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" />

                                                <ColorAnimation To="#CEEE" Duration="0:0:0.3" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation To="#CDDD" Duration="0:0:0.3" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.EnterActions>

                                    <Trigger.ExitActions>

                                        <BeginStoryboard>

                                            <Storyboard>

                                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)" />

                                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)" />

                                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="content" Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

                                                <ColorAnimation Duration="0:0:0.1" Storyboard.TargetName="fore" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

                                            </Storyboard>

                                        </BeginStoryboard>

                                    </Trigger.ExitActions>

                                </Trigger>

                            </ControlTemplate.Triggers>

                        </ControlTemplate>

                    </Setter.Value>

                </Setter>

            </Style>

        </Application.Resources>

    </Application>

     

    效果图:鼠标是在2这里,有微微的光芒!

    展开全文
  • WPF(二)举例讲解WPF布局

    千次阅读 2010-05-26 14:56:00
    WPF(二)举例讲解WPF布局 WPF中的控件布局 就讲六个控件是杂个用的,包括: Canvas, DockPanel, Grid, StackPanel, WrapPanel, VirtualizingStackPanel 1. Canvas :简单地设置坐标值来布局Canvas很单纯地设置其子...

    WPF(二)举例讲解WPF布局

     

    WPF中的控件布局

     

    就讲六个控件是杂个用的,包括: Canvas, DockPanel, Grid, StackPanel, WrapPanel, VirtualizingStackPanel

     

    1. Canvas :简单地设置坐标值来布局

    Canvas很单纯地设置其子控件相对于它的Top, Left, Bottom., Right值来进行定位其子控件.

        例子:

    <Canvas>

            <Button Canvas.Top="10" Canvas.Left="10" Content="Canvas 进行 (x,y) 定位(10,10)"  />

    </Canvas>

    效果图:

    2, DockPanel:

        为其子控件提供相对的停靠位置, 包括向左停靠(Dock.Left),向右停靠(Dock.Right),向下停靠(Dock.Bottom),向上停靠.DockPanel 使您在停靠项时,无需担心它们的确切 (x,y) 位置

        例子:

    <DockPanel Grid.Column="1" Grid.Row="0">

                <Menu DockPanel.Dock="Top">

                    <MenuItem Header="Menu" >

                        <MenuItem Header="open" />

                        <MenuItem Header="save" />

                    </MenuItem>

                    <MenuItem Header="Edit" />

                </Menu>

                <TreeView>

                    <TreeViewItem Header="DockPanel"/>

                    <TreeViewItem Header="香港电影">

                        <TreeViewItem Header="无间道" />

                        <TreeViewItem Header="伤城" />

                        <TreeViewItem Header="和平饭店" />

                        <TreeViewItem Header="阿郎的故事" />

                        <TreeViewItem Header="秋天的童话" />

                        <TreeViewItem Header="赌神" />

                    </TreeViewItem>

                    <TreeViewItem Header="欧美电影"/>

                </TreeView>

                <ListBox>

                    <ListBoxItem>DockPanel 使您在停靠项时</ListBoxItem>

                    <ListBoxItem>无需担心它们的确切 (x,y) 位置</ListBoxItem>

                    <ListBoxItem>listBoxItem</ListBoxItem>

                </ListBox>

            </DockPanel>

    效果图:

    3. Grid:表格布局

    Grid允许我们通过自定义行列来进行布局,主要作用就是画格格,网格定位.

    通过设置ColumnsRows的属性,通过定义GridColumnDifinitionsRowDifinitions来实现对于表格的定义,然后根据Grid.ColumnGrid.Row的对象来制定位置的方式实现布局.

    例子:

    <Grid>

            <Grid.RowDefinitions>

                <RowDefinition Height="*"/>

                <RowDefinition Height="*"/>

                <RowDefinition Height="*"/>

            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="*"/>

                <ColumnDefinition Width="*"/>

                <ColumnDefinition Width="*"/>

            </Grid.ColumnDefinitions>

            <Button x:Name="panel1" Grid.Row="0" Grid.Column="1" Background="Red"></Button>

            <Button x:Name="panel2" Grid.Row="1" Grid.Column="0" Background="Red"></Button>

            <Button x:Name="panel3" Grid.Row="1" Grid.Column="2" Background="Red"></Button>

            <Button x:Name="panel4" Grid.Row="2" Grid.Column="1" Background="Red"></Button>

            <Button x:Name="panel5" Grid.Row="1" Grid.Column="1" Content="Grid画格格"></Button>

            <Button x:Name="panel6" Grid.Row="0" Grid.Column="0" Content="网格定位"></Button>

    </Grid>

    效果图:

    4. StackPanel :按照水平线方向或垂直线方向排列控件

         StackPanel允许你按照指定的方向其中添加子控件

        Orientation=" Horizontal"表示纵向

        Orientation="Vertical"表示横向

        例子:

        <StackPanel Orientation="Horizontal" Background="silver" Margin="20">

                <!--Orientation="Vertical"表示纵向-->

                <Label Margin="5" Content="提供一个" />

                <TextBox Margin="5" Text="从左至右" BorderBrush="Blue" Foreground="Black" Width="100"/>

                <Button Name="test" Width="100" Height="50" Content="或从上至下"/>

                <Button  Content="放置内容的堆栈模型"/>

                <Label Name="testlabel"  Content="!"/>

            </StackPanel>

    效果图:

    5. WrapPanel: 自动换行子控件的布局

        WrapPanel 模型是资源管理器窗口的右侧窗格,使您可以处理在当前行已满之后流入新行中的项。

        例子:

        <WrapPanel Background="Silver" Margin="40">

                <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button />

                <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button />

                <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button />

                <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button />

            </WrapPanel>

        效果图:

    (小块块就是Button

    6. VirtualizingStackPanel

        可视化是一种改善数据密集型应用程序性能的很好方式。可通过VirtualizingStackPanel控件获得 WPF 中的 UI 可视化。对于大量的项而言,这要比 StackPanel 70 倍。

        我们在加载字体列表时可能会遇到了一个让人崩溃的问题:由于系统字体可能较多(可能有好几百项),导致使用ComboBox显示字体列表异常缓慢,这是由于ComboBox在展开列表时绘制了列表中的每一项,为了避免这个问题,我们可以使用 VirtualizingStackPanel来代替ComboBox默认的项目面板StackPanel

    然后速度就很快了,与仅仅加载少量项目速度一样快,因为其只绘制了当前被显示的项。

        例子:

        <Grid>   

            <ComboBox x:Name="comboboxFontList1" VerticalAlignment="Top">

                <ComboBox x:Name="comboboxFontList2" VerticalAlignment="Top">

                    <ComboBox.ItemsPanel>

                        <ItemsPanelTemplate>

                            <VirtualizingStackPanel />

                        </ItemsPanelTemplate>

                    </ComboBox.ItemsPanel>

                </ComboBox>

            </ComboBox>

    </Grid>

    效果图:就是ComboBox里面夹ComboBox

    展开全文
  • WPF(四)举例讲解WPF控件模版

    千次阅读 2010-05-26 15:37:00
    WPF(四)举例讲解WPF控件模版WPF学习 WPF的每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应。我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件。与Style...

    WPF(四)举例讲解WPF控件模版

    WPF学习

     

    WPF的每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应。我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件。

    Style不同,Style只能改变控件的已有属性值(比如颜色字体)来定制控件,但控件模板可以改变控件的内部结构(VisualTree,视觉树)来完成更为复杂的定制。

    要替换控件的模板,我们只需要声明一个ControlTemplate对象,并对该ControlTemplate对象做相应的配置,然后将该ControlTemplate对象赋值给控件的Template属性就可以了。

    ControlTemplate
    包含两个重要的属性:
    1
    VisualTree,该模板的视觉树,其实我们就是使用这个属性来描述控件的外观的
    2
    Triggers,触发器列表,里面包含一些触发器Trigger,我们可以定制这个触发器列表来使控件对外界的刺激发生反应,比如鼠标经过时文本变成粗体等。

     

    一:Understanding Logical Trees and Visual Trees 理解逻辑树和视觉树

    (1)              视觉树

    (2)              逻辑树

    LogicalTreeHelper Methods逻辑树辅助方法

    Name

    Description

    FindLogicalNode()

    查找某一特定元素的名字,开始在指定部分搜索下面的逻辑树。

    BringIntoView()

    Scrolls an element into viewThe FrameworkElement.BringIntoView() method

    performs the same trick.

    GetParent()

    取得父元素具体内容

    GetChildren()

    取得子元素的一个具体内容

     

    <Button.Template>
              <ControlTemplate>
                <!--
    定义视觉树-->
                <Grid>
            … …
                </Grid>
                <!--
    定义视觉树_end-->            
    </ControlTemplate>

     

    <ControlTemplate> ... </ControlTemplate>之间包含的是模板的视觉树,也就是如何显示控件的外观

     

    二:Creating Control Templates 创建控件模版

     

        <Window.Resources>

            <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">

                <Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2" Background="Red" TextBlock.Foreground="White"></Border>

            </ControlTemplate>

        </Window.Resources>

        <StackPanel Margin="5">

            <Button Padding="5" Margin="5" Template="{StaticResource ButtonTemplate}">Template Button</Button>

            <Button Padding="5" Margin="5">Second Button</Button>

    </StackPanel>

     

    ControlTemplate定义模版

    TargetType使用哪个的模版

    Template="{StaticResource 模版名称} 控件调用模版

     

    三:Template Bindings 模版绑定

    <ControlTemplate>

         <Grid>

          <TextBlock Name="txtBlock" Margin="{TemplateBinding Button.Padding}" VerticalAlignment="Center"  HorizontalAlignment="Center"  Text="{TemplateBinding Button.Content}" />

        </Grid>

    </ControlTemplate>

     

    属性="{TemplateBinding 模版属性}"

    使用TemplateBinding 将控件的属性与新外观中的元素的属性关联起来,Text="{TemplateBinding Button.Content}",这样我们就使得TextBlockText与按钮的Content绑定在一起而保持一致,

    Text="{TemplateBinding Button.Content}"

     

    四:Template Triggers 模版触发器

    <!--定义触发器-->

    <ControlTemplate.Triggers>

        <Trigger  Property="Button.IsMouseOver"  Value="True">    

             <Setter Property="Button.Foreground" Value="Red" />

         </Trigger>

    </ControlTemplate.Triggers>

    <!--定义触发器_End-->

     

    当事件Button.IsMouseOver= True时执行Button.Foreground= Red

    这里有一个隐含的意思是:当ButtonIsMouseIOver属性变成False时,设置器中设置的属性将回复原值。

     

    五:Organizing Template Resources模版资源组管理

    虽然你可以把所有的模板弄成一个单一的资源字典文件, 经验丰富的程序员更愿意为每个控制模板创建一个单独的资源字典。

    (1)       创建资源字典,取名叫Button,定义控件模版

    <ResourceDictionary

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

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

    <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">

    </ControlTemplate>

    </ResourceDictionary>

    (2)       调用

    <Application x:Class="SimpleApplication.App"

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

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

    StartupUri="Window1.xaml">

    <Application.Resources>

    <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

    <ResourceDictionary Source="Resources/Button.xaml" />

    </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

    </Application.Resources>

    </Application>

     

    六:Refactoring the Button Control Template 重构按钮控制模版

    设置好几种属性,定义好名字,控件的属性可以直接绑定到该属性上。如:

    定义属性:

    <RadialGradientBrush RadiusX="1" RadiusY="5" GradientOrigin="0.5,0.3"

    x:Key="Border">

    <GradientStop Color="White" Offset="0" />

    <GradientStop Color="Blue" Offset="1" />

    </RadialGradientBrush>

    绑定属性:

    <ControlTemplate x:Key="GradientButtonTemplate" TargetType="{x:Type Button}">

    <Border Name="Border" BorderBrush="{StaticResource Border}"

    … …

    … …

    七:Applying Templates with Styles 应用模版风格

    先定义控件模版的属性为控件本身默认属性,再通过Style进行风格设置。

    定义属性:

    Background="{TemplateBinding Background}"

    属性名字= "{TemplateBinding 属性名字}"

    设置:

    <Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}">

    <Setter Property="Control.Template" Value="{StaticResource CustomButtonTemplate}"></Setter>

    </Style>

     

    八:Applying Templates Automatically 自动应用模版

    设置个模版,不定义名字,用的时候名字取Null

    先设置个样式:

    <Style TargetType="{x:Type Button}">

    <Setter Property="Control.Template" Value="{StaticResource ButtonTemplate}"

    </Style>

    我们要取消自动应用这个样式,可以这样写:

    <Button Style="{x:Null}" ... ></Button>

     

    九:User-Selected Skins 用户选择皮肤

    引用资源字典,然后就可以NEW个新的,重新选择资源字典,相当于在换皮肤了,因为样式和控件模版都可以放在资源字典里面。

    1):

    <Window.Resources>

    <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

    <ResourceDictionary Source="Resources/GradientButton.xaml"></ResourceDictionary>

    </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

    </Window.Resources>

    2):

    ResourceDictionary newDictionary = new ResourceDictionary();

    newDictionary.Source = new Uri( "Resources/GradientButtonVariant.xaml", UriKind.Relative);

    this.Resources.MergedDictionaries[0] = newDictionary;

     

    展开全文
  • WPF(五)举例讲解WPF数据绑定

    千次阅读 2010-05-26 14:39:00
    举例讲解WPF数据绑定 本来想通过WPF白皮书来讲解,看完过后发现过于详细,很多东西不是那么容易让人理解,便在网上收集了部分东西进行整理。也包括自己总结的部分。 要使用 WPF 数据绑定功能,您必须始终要有目标...

     举例讲解WPF数据绑定

     

    本来想通过WPF白皮书来讲解,看完过后发现过于详细,很多东西不是那么容易让人理解,便在网上收集了部分东西进行整理。也包括自己总结的部分。

     

     要使用 WPF 数据绑定功能,您必须始终要有目标和源。绑定的目标可以是从 DependencyProperty 派生而来的任何可访问属性或元素,例如 TextBox 控件的 Text 属性。绑定的源可以是任何公共属性,包括其他控件、公共语言运行库 (CLR) 对象、XAML 元素、ADO.NET DatasetXML 片段等的属性。为了帮助您正确实现绑定,WPF 包含了两个特殊的提供程序:XmlDataProvider ObjectDataProvider

     

    Source.:提供数据的对象

    RelativeSource.相对源对象

    DataContext.:数据文本对象

     

    一:简单的绑定

    1

    <TextBlock.Text>
    <Binding ElementName="lbColor" Path="SelectedItem.Content"/>
    </TextBlock.Text>

    或:

    <TextBlock Text="{Binding ElementName=lbColor,
    Path=SelectedItem.Content}" />

    Binding 标记的 ElementName 属性指示 TextBlock Text 属性要与其绑定的控件的名称。Path 属性指示我们将绑定到的元素(在本例中是 ListBox)的属性。

    2

    以下依次为:NEW个绑定,设置源,设置路径,设置数据流如模式,绑定

    Binding binding = new Binding();

    binding.Source = sliderFontSize;

    binding.Path = new PropertyPath("Value");

    binding.Mode = BindingMode.TwoWay;

    lblSampleText.SetBinding(TextBlock.TextProperty, binding);

     

    二:绑定模式

    <TextBlock
    Text="{Binding ElementName=lbColor, Path=SelectedItem.Content, Mode=OneWay}"/>

    请注意前一个示例中将 Mode 属性设为 OneWay 的语句。Mode 属性用于定义绑定模式,它将决定数据如何在源和目标之间流动。除 OneWay 之外,还有另外三种绑定模式:OneTimeOneWayToSource TwoWay

    当我想向用户显示只读数据时,我通常会采用 OneWay 模式。

    当我希望用户可以更改控件中的数据,并且让该变化能在数据源(DataSet、对象、XML 或其他绑定控件)中体现出来时,我会使用 TwoWay 绑定。

    如果想让用户在数据源不将其数据绑定到目标的情况下更改数据源,我发现 OneWayToSource 是个不错的选择。

    接到一个任务,要求在只读控件中显示与加载屏幕时一样的数据状态时,可以使用 OneTime 绑定。

    Name

            Description

    OneWay

    每当源发生变化,数据就会从源流向目标。

    TwoWay

    会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。

    OneTime

    仅当应用程序启动时或 DataContext 进行更改时会将数据从源发送到目标

    OneWayToSource

    将数据从目标发送到源

    Default

    双向绑定。

     

     

    三:绑定时间

    UpdateSourceTrigger 指定值,它是用于定义何时更新源的绑定属性。可以为 UpdateSourceTrigger 设置三个值:ExplicitLostFocus PropertyChanged

    UpdateSourceTrigger 设置为 Explicit,则不会更新源,除非从代码调用 BindingExpression.UpdateSource 方法。LostFocus 设置(TextBox 控件的默认值)指示源在目标控件失去焦点时才会更新。PropertyChanged 值指示目标会在目标控件的绑定属性每次发生更改时更新源。如果您想指示绑定的时间,该设置非常有用。

     

    四:绑定到 XML

    XmlDataProvider 可用来绑定到 XML 文档或片断,该文档或片段既可以嵌入在 XmlDataProvider 标记中,也可以位于外部位置引用的文件中。

    嵌入式 XML 内容必须置于 XmlDataProvider 内部的 <x:XData> 标记中,必须为 XmlDataProvider 提供 x:Key 值,以便数据绑定目标可对其进行引用。如:

    <StackPanel>
    <StackPanel.Resources>
    <XmlDataProvider x:Key="MoreColors" XPath="/colors">
      <x:XData>
        <colors >
          <color name="pink"/>
          <color name="white"/>
        </colors>
      </x:XData>
    </XmlDataProvider>

     

    XmlDataProvider 定义为 StackPanel 上下文中的资源。这意味着 XmlDataProvider 将可用于该 StackPanel 内部的所有内容。

    绑定到控件时,可以设置绑定的 ElementName Path 属性。但是绑定到资源时,需要设置 Source 属性,由于我们是绑定到 XmlDataProvider,所以还要设置绑定的 XPath 属性。如:

    <ListBox x:Name="lbColor"  IsSynchronizedWithCurrentItem="True"
      ItemsSource="{Binding Source={StaticResource MoreColors},
      XPath=color/@name}">
    </ListBox>

     

    XmlDataProvider 也可以指向 XML 内容的外部源,XmlDataProvider 资源添加到 StackPanel,并将其引向 XML 文件即可。请注意,将 Source 属性设置为了 XML 文件的名称,并将 x:Key 设置为 Colors:如:

    <XmlDataProvider x:Key="Colors" Source="Colors.xml" XPath="/colors"/>

     

    五:对象绑定和 DataTemplates

    想绑定到对象或对象列表时,可以创建 ObjectDataProvider 作为资源。ObjectDataProvider ObjectType 指定将提供数据绑定源的对象,而 MethodName 则指示为获得数据而需调用的方法。

    例如,有一个名为 PersonService 的类,该类使用一种名为 GetPersonList 的方法来返回列表 <Person>,那么 ObjectDataProvider 可能会如下所示:

    <StackPanel.Resources>
    <ObjectDataProvider x:Key="persons"
    ObjectType="{x:Type svc:PersonService}"
    MethodName="GetPersonList"></ObjectDataProvider>
    </StackPanel.Resources>

     

    ObjectDataProvider 还可以使用许多其他属性。ConstructionParameters 属性允许您将参数传递给要调用的类的构造函数。此外,可以使用 MethodParameters 属性来指定参数,同时还可以使用 ObjectInstance 属性来指定现有的对象实例作为源。

     

    在添加 ObjectDataProvider 时,必须限定数据源类的命名空间。如:

    xmlns:svc="clr-namespace:DataBindingWPF"

    既然数据源已通过 ObjectDataProvider 定义,接着我想将 ListBox 控件中的项绑定到此数据。我想在每个 ListBoxItem 中显示两行文本。第一行将以粗体显示 Person 实例的 FullName 属性,第二行将显示该实例的 Title City。在 XAML 中,通过使用 DataTemplate,这是很容易实现的,DataTemplate 允许您定义可重用的数据可视化策略。其中将 DataTemplate 定义为在我指定的布局中显示 Person 信息。我设置了 DataTemplate DataType 属性,以指示 DataTemplate 将会引用 Person 类类型。我没有在 DataTemplate 中指定真正的绑定,因为我会在 ListBox 控件中指定。通过省略绑定源,可对作用域内的当前 DataContext 执行绑定。我将 ListBox ItemsSource 属性设置为绑定到人员资源,以便我可以将数据绑定到 ListBox,而不用对它进行格式化。通过将 ItemTemplate 属性设置为 PersonLayout 资源(即 DataTemplate 的键名),可以正确显示数据。如下:

    <Window x:Class="DataBindingWPF.ObjectBinding"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:svc="clr-namespace:DataBindingWPF"
    Title="DataBindingWPF" Height="300" Width="300">
    <StackPanel>
      <StackPanel.Resources>
        <ObjectDataProvider x:Key="persons"
         ObjectType="{x:Type svc:PersonService}"
         MethodName="GetPersonList" ></ObjectDataProvider>
          <DataTemplate x:Key="personLayout" DataType="Person">
            <StackPanel Orientation="Vertical">
              <TextBlock Text="{Binding Path=FullName}"
                  FontWeight="Bold" Foreground="Blue">
              </TextBlock>
            <StackPanel Orientation="Horizontal">
              <TextBlock Text="{Binding Path=Title}"></TextBlock>
              <TextBlock Text=", "></TextBlock>
              <TextBlock Text="{Binding Path=City}"></TextBlock>
            </StackPanel>
          </StackPanel>
        </DataTemplate>
      </StackPanel.Resources>
      <TextBlock></TextBlock>
      <ListBox x:Name="lbPersons"
          ItemsSource="{Binding Source={StaticResource persons}}"
          ItemTemplate="{DynamicResource personLayout}"
          IsSynchronizedWithCurrentItem="True"/>
    </StackPanel>
    </Window>

    六:对数据进行排序

    如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProviderCollectionViewSource 则会成为数据源,并充当截取 ObjectDataProvider 中的数据的媒介,并提供排序、分组和筛选功能,然后将它传送到目标。

      接着显示的 CollectionViewSource 将其 Source 属性设置为 ObjectDataProvider(人员)的资源名称。然后我通过指示排序依据的属性及其方向定义了数据的排序顺序:

    <CollectionViewSource x:Key="personView"
      Source="{Binding Source={StaticResource persons}}">
      <CollectionViewSource.SortDescriptions>
      <ComponentModel:SortDescription
      PropertyName="City"
      Direction="Ascending" />  
      <ComponentModel:SortDescription
      PropertyName="FullName"
      Direction="Descending" />
      </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>

     

    DataContext 可用来将容器控件内部的所有控件都绑定到数据源中。如:

    <StackPanel>
    <TextBlock Text="{Binding Source={StaticResource personView},
      Path=FullName}"></TextBlock>
    <TextBlock Text="{Binding Source={StaticResource personView},
      Path=Title}"></TextBlock>
    <TextBlock Text="{Binding Source={StaticResource personView},
      Path=City}"></TextBlock>
    </StackPanel>

     

    以下是绑定到 DataContext 的三个相同的 TextBox,在此处,DataContext 反过来引用了该控件的 StackPanel 容器:

    <StackPanel DataContext="{Binding Source={StaticResource personView}}" >
    <TextBlock Text="{Binding Path=FullName}"></TextBlock>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
    <TextBlock Text="{Binding Path=City}"></TextBlock>
    </StackPanel

    展开全文
  • 分析:所有WPF控件都继承自Control,那么所谓的隐藏Header,实际上就是将显示Header的控件隐藏掉。 本文介绍的方法,个人认为可以适用于其他任何需要隐藏控件的场景——即将高度或宽度置为0。 ————————...
  • WPF(一)举例讲解XML语法和格式 XAML是一种陈述性语言,类似XML。 XAML文件通常是以.xaml为后缀。 我们主要讲一下具体用法,拿个例子来讲,一下就懂了。以VS2008为新建WPF应用程序为例子.新建项目后,自动为第一...
  • WPF Trigger Property常用项具体举例

    千次阅读 2017-07-12 14:11:45
    对字体颜色进行更改设置-->        字体点击时候进行偏移     
  • 深入WPF中的图像画刷 ImageBrush 之1——ImageBrush使用举例
  • 近期在项目希望实现 编辑值与原始数据的 双向转换。 经过调试,这才发现Converter自带该功能。 以下是一个简单案例。 1.创建数据实体 namespace WpfApp_converter.Model { /// <summary>...
  • 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例 原文:深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例 昨天我在《简述WPF中的画刷(Brush)》中简要介绍了...
  • WPF理念

    2020-07-11 11:55:14
    WPF是一种界面展示技术,上一个比较流行的是WINODWS FORM。WinForm主要是事件驱动,通过创建大量事件处理函数使程序运行。事件驱动依然很有用,但是数据驱动对于软件架构的发展也是一个进步。尤其对于大型的软件开发...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门.... 3 1. WPF基础之体系结构... 3 2. WPF基础之XAML. 9 3. WPF基础之基元素... 23 4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... ...
  • WPF多线程

    千次阅读 2014-01-14 21:20:04
     通常,WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI。呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入、处理事件、绘制屏幕以及运行应用程序代码。大多数应用程序都使用一个 UI 线程,但...
  • WPF 窗口

    2018-09-25 08:50:00
    WPF 窗口 原文:WPF 窗口在WPF中,经常需要对窗口进行设置,下面讲讲常用的几个设置。 窗口样式 1、无边框窗口 无边框透明窗体 设置 WindowStyle="None"--无边框,如果需要其它按钮,如缩小、放大...
  • wpf笔记

    2020-01-03 14:57:47
    WPF开发: xaml 语言类似于xml,主要是界面和逻辑分离。 两个属性的问题: attribute/property 第一个属性attribute 和c#类的数据字段对应 第二个属性property 和c#的属性对应 get set 对于c# wpf,property...
  • WPF控件结构

    2020-07-11 20:33:06
    WPF控件结构 控件都是继承的,举例Button。 Button->ButtonBase->ContentControl->Control->FrameworkElement 有些基础属性,比如Width,Height是FrameworkElement就定义了。 控件的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,183
精华内容 873
关键字:

wpf举例