2013年11月05日

WPFサンプル・目次

   このエントリーをはてなブックマークに追加 Clip to Evernote
昨年(2012年)から掲載しているWPFのサンプルコードですが、随分と数が増えてきたので、目次を作成しました。
※ この目次の順序は、記事の掲載順とは若干変更しています。

コントロール リソースの利用 データ・バインディング イベント コマンド 2D Graphics スタイル トリガー DataTemplate等によるコントロールのカスタマイズ アニメーション ドラッグ・ドロップ アプリケーション・ファイル その他   

Posted by gushwell at 21:30Comments(4)TrackBack(0)

2013年10月31日

WPFサンプル:VisualStateManagerでコントロールの状態ごとの外観をカスタマイズする

   このエントリーをはてなブックマークに追加 Clip to Evernote
VisualStateManagerを使うと、コントロールの状態ごとに外観を変化させることが可能です。
VisualStateManagerを使って、Buttonの外観を変えてみました。

ここでは、Window.ResourcesにControlTemplateを定義し、その中で、isualStateManagerを使って、Buttonの外観を変化させています。
Buttonにはすでに、"Normal" "MouseOver" といった状態が定められているので、その状態ごとにどういったAnimationを実行するかを定義することができます。

<Window x:Class="VisualStateManagerButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="Button" >
            <Setter Property="Background" Value="#115E8B" />
            <Setter Property="Foreground" Value="White" />
        </Style>
        <ControlTemplate  x:Key="ButtonTemplate" TargetType="Button">
           
            <Grid x:Name="MyButton" Background="{TemplateBinding Background}" Margin="1">
                <ContentPresenter
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                       
                        Margin="4,5,4,4" />
                <VisualStateManager.VisualStateGroups>
                   
                    <VisualStateGroup Name="CommonStates">
                        <VisualState Name="Normal" />
                        <VisualState Name="MouseOver">
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="MyButton"
                                        Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"                       
                                        Duration="00:00:00.1"
                                        To="#1570A6" />
                                <ThicknessAnimation Storyboard.TargetName="MyButton"
                                        Storyboard.TargetProperty="Margin"
                                        Duration="00:00:00.1"
                                        To="0,0,0,0" />
                            </Storyboard>                           
                        </VisualState>
                        <VisualState Name="Pressed">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="MyButton"
                                        Storyboard.TargetProperty="Opacity"
                                        Duration="00:00:00.1"
                                        To="0.6"/>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Grid>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Button Width="120" Height="40"
                Template="{StaticResource ButtonTemplate}"
                Content="Click Me!"  />
    </Grid>
</Window>

C#のコード側では何も記述する必要はありません。

以下、実行結果です。


通常の状態
VisualState1

マウスオーバーの状態
VisualState2

マウスをプレスした状態
VisualState3



WPFサンプル・目次
  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2013年10月20日

WPFサンプル:UIスレッド以外で発生した未処理例外には対応する

   このエントリーをはてなブックマークに追加 Clip to Evernote
WPFサンプル:未処理例外に対応する」 では、UIスレッド内で発生した未処理例外に対応するサンプルを掲載しましたが、UIスレッド以外で発生した未処理例外には対応できません。
UIスレッド以外で発生した未処理例外には対応するには、AppDomain.CurrentDomain.UnhandledException イベントを利用します。
そのサンプルを以下に示します。

UnhandledExceptionSample1

UnhandledExceptionSample2


UnhandledExceptionイベントハンドラの設定は、以下のように、App.xaml.csでやるのが適当かと思います。

using System;
using System.Windows;
namespace UnhandledExceptionSample {
    public partial class App : Application {
        private void Application_Startup(object sender, StartupEventArgs e) {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }
        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
            Exception ex = e.ExceptionObject as Exception;
            MessageBox.Show(ex.Message, "例外発生(UI スレッド外)",
                                  MessageBoxButton.OK, MessageBoxImage.Error);
            this.Shutdown();
        }
        private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {
            MessageBox.Show(e.Exception.Message, "例外発生",
                                  MessageBoxButton.OK, MessageBoxImage.Error);
            e.Handled = true;
        }
    }
}


コードを見ていただければわかると思いますが、UIっスレッド以外で発生した未処理例外の場合は、 Shutdownメソッドを呼び出して、アプリケーションを終了させています。
Shutdownメソッドの行をコメントにしても、アプリケーションは終了してしまいます。
もし、アプリケーションを終了させたくない場合は、スレッド内で発生した例外はそのスレッド内で try-catchを使い、例外処理を記述する必要があります。
App.xamlは、「WPFサンプル:未処理例外に対応する」のものと変更ありません。

<Application x:Class="UnhandledExceptionSample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             Startup="Application_Startup"
             DispatcherUnhandledException="Application_DispatcherUnhandledException"
             >
    <Application.Resources>
        
    </Application.Resources>
</Application>

以下、MainWindow.xaml と MainWindow.xaml.cs です。

<Window x:Class="UnhandledExceptionSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="120" Width="260" >
    <StackPanel >
        <Button Content="UIスレッドで例外発生"  Margin ="3"
                Width="186" Click="Button_Click1"/>
        <Button Content="UIスレッド外で例外発生"  Margin="3"
                Width="186" Click="Button_Click2" />
    </StackPanel>
</Window>


using System.Threading;
using System.Windows;
namespace UnhandledExceptionSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
        private void Button_Click1(object sender, RoutedEventArgs e) {
            throw new System.NotImplementedException();
        }
        private void Button_Click2(object sender, RoutedEventArgs e) {
            Thread th = new Thread(DoWork);
            th.Start();
        }
        private void DoWork(object obj) {
            throw new System.NotImplementedException();
        }
    }
}

  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2013年10月14日

WPFサンプル:NavigationServiceを使ったページ遷移

   このエントリーをはてなブックマークに追加 Clip to Evernote
ウィザード画面のように、次へ、前へボタンがあるようなプログラムを WPFのナビゲーション機能を使って実装したサンプルを掲載します。

どんなプログラムなのかイメージがわくように、まずは実行時のスクリーンショットをお見せします。

Navi1

Navi2

Navi3

以下、作成手順です。

1. ウィンドウの作成 WPFアプリケーションプロジェクトを新規作成してできる MainWindowのXAMLを以下のように変更します。

<Window x:Class="PageNavigationSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="250" Width="325">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="32"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="32"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Background="#FF043957">
            <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" Text="ページ遷移サンプル"
                       Foreground="White"/>
        </StackPanel>
        <Frame Grid.Row="1" NavigationUIVisibility="Hidden" Name="myFrame" />
        <StackPanel Orientation="Horizontal" Background="#FF043957" Grid.Row="2">
            <Button Name="prevButton" Content="Prev" HorizontalAlignment="Left"
                    Margin="10,0,0,0" Grid.Row="2" VerticalAlignment="Center"
                    Width="50" />
            <Button Name="nextButton" Content="Next" HorizontalAlignment="Left"
                    VerticalAlignment="Center" Width="50"  />
        </StackPanel>
    </Grid>
</Window>

■ デザイン時のスクリーンショット
Navi4

Gridを3つに分割し、真ん中にFrameを配置しています、ここに次の「ページの作成」で作成するページが表示されることになります。
下の段には、Prev, Nextボタンを配置します。


2. 各ページの作成 ソリューションエクスプローラでプロジェクトを右クリックし、[追加(D)]-[ページ(P)]で3つのページをプロジェクトに追加してください。[ウィンドウの追加]ではありませんので注意してください。それぞれのページを以下のようにデザインします。

Navi5

3つのページ共に、TextBlockを貼り付けただけの簡単なものです。

#ページ1
<Page x:Class="PageNavigationSample.Step01Page"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      mc:Ignorable="d"
      d:DesignHeight="186" d:DesignWidth="325"     Title="Step01Page1">
    <Grid>
        <TextBlock HorizontalAlignment="Left" Margin="20,20,0,0" TextWrapping="Wrap"
                   Text="ページ 1 " VerticalAlignment="Top"/>
    </Grid>
</Page>

#ページ2
<Page x:Class="PageNavigationSample.Step02Page"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      mc:Ignorable="d"
      d:DesignHeight="186" d:DesignWidth="300"
     Title="Step02Page1">
    <Grid>
        <TextBlock HorizontalAlignment="Left" Margin="40,30,0,0" TextWrapping="Wrap"
                   Text="ページ 2 " VerticalAlignment="Top"/>
    </Grid>
</Page>

#ページ3
<Page x:Class="PageNavigationSample.Step03Page"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      mc:Ignorable="d"
      d:DesignHeight="186" d:DesignWidth="300"
     Title="Step03Page1">
    <Grid>
        <TextBlock HorizontalAlignment="Left" Margin="60,40,0,0" TextWrapping="Wrap"
                   Text="ページ 3 " VerticalAlignment="Top"/>
    </Grid>
</Page>

3. NavigationServiceオブジェクトをフィールドに定義します。
public MainWindow() {
    InitializeComponent();
    _navi = this.myFrame.NavigationService;
}
private NavigationService _navi; 

NavigationServiceクラスは、戻る、進むなどのページナビゲーションを管理するためのクラスです。Frameは、ナビゲーションをサポートするコンテンツコントロールであり、 NavigationServiceプロパティがあります。
NavigationServiceオブジェクトを参照するのに、そのつど、Drameオブジェクトから取得するのは面倒なので、MainWindowのコンストラクタで、_navi フィールドに値をセットしています。

4. 初期ページを指定する
いろいろな方法が考えられますが、ここではもっとも手軽と思われる、コードビハインド側で指定することとします。Frameの Loadedイベントハンドラを以下のように記述します。
private List<Uri> _uriList = new List<Uri>() {
    new Uri("Step01Page.xaml",UriKind.Relative),
    new Uri("Step02Page.xaml",UriKind.Relative),
    new Uri("Step03Page.xaml",UriKind.Relative),
};
private void myFrame_Loaded(object sender, RoutedEventArgs e) {
    _navi.Navigate(_uriList[0]);
}

今回は、3つのページを管理するので、3ページのUriをListに記憶してお、その先頭のページを、NavigateメソッドでFrameに表示しています。

5. Prev, Next ボタンクリック時の動作を実装する
ボタンクリックのイベントハンドラを以下のように記述します。

private void prevButton_Click(object sender, RoutedEventArgs e) {
    if (_navi.CanGoBack)
        _navi.GoBack();
    else {
        int index = _uriList.FindIndex(p => p == _navi.CurrentSource) - 1;
        _navi.Navigate(_uriList[index]);
    }
}
private void nextButton_Click(object sender, RoutedEventArgs e) {
    if (_navi.CanGoForward)
        _navi.GoForward();
    else {
        int index = _uriList.FindIndex(p => p == _navi.CurrentSource) + 1;
        _navi.Navigate(_uriList[index]);
    }
}

一度訪れたページは、GoBack, GoForwordでページ遷移ができますので、Navigateメソッドではなく、GoBack, GoForword メソッドを使います。
まだ訪れていないページの場合は、Navigateメソッドでページ遷移をします。

6. ボタンのIsEnableを制御する

先頭ページの時は、Prevボタンを非活性化させボタンを押せないようにする必要があります。最後のページも同様ですね。
ここでは、FrameのNavigatedイベントで実装することとします。

private void myFrame_Navigated(object sender, NavigationEventArgs e) {
    int index = _uriList.IndexOf(_navi.CurrentSource);
    if (index <= 0)
        prevButton.IsEnabled = false;
    else
        prevButton.IsEnabled = true;
    if (index + 1 == _uriList.Count)
        nextButton.IsEnabled = false;
    else
        nextButton.IsEnabled = true;
}

以上で実装が完了です。


最後に、イベントハンドラの設定を追加したMainWindowのXAMLを掲載します。

<Window x:Class="PageNavigationSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="250" Width="325">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="32"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="32"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Background="#FF043957">
            <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" Text="ページ遷移サンプル"
                       Foreground="White"/>
        </StackPanel>
        <Frame Grid.Row="1" NavigationUIVisibility="Hidden" Name="myFrame"
               Loaded="myFrame_Loaded" Navigated="myFrame_Navigated" />
        <StackPanel Orientation="Horizontal" Background="#FF043957" Grid.Row="2">
            <Button Name="prevButton" Content="Prev" HorizontalAlignment="Left"
                    Margin="10,0,0,0" Grid.Row="2" VerticalAlignment="Center"
                    Width="50" Click="prevButton_Click"/>
            <Button Name="nextButton" Content="Next" HorizontalAlignment="Left"
                    VerticalAlignment="Center" Width="50" Click="nextButton_Click" />
        </StackPanel>
    </Grid>
</Window>



WPFサンプル・目次
  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2013年09月18日

WPFサンプル:OpenFileDialog と SaveFileDialog

   このエントリーをはてなブックマークに追加 Clip to Evernote
OpenFileDialog, SaveFileDialog のサンプルです。

このサンプルは、XAMLではコントロールの配置だけで、あとは、C#側で記述しています。

using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace OpenFileSaveFileDialogSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }

        private void buttonOpen_Click(object sender, RoutedEventArgs e) {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.FilterIndex = 1;
            openFileDialog.Filter = "テキスト ファイル(.txt)|*.txt|HTML File(*.html, *.htm)|*.html;*.htm|All Files (*.*)|*.*";
            bool? result = openFileDialog.ShowDialog();
            if (result == true) {
                textBlock1.Text = openFileDialog.FileName;
                using (Stream fileStream = openFileDialog.OpenFile()) {
                    StreamReader sr = new StreamReader(fileStream,true);
                    textBox1.Text = sr.ReadToEnd();
                }
            }
        }

        private void buttonClose_Click(object sender, RoutedEventArgs e) {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.FilterIndex = 1;
            saveFileDialog.Filter = "テキスト ファイル(.txt)|*.txt|HTML File(*.html, *.htm)|*.html;*.htm|All Files (*.*)|*.*";
            bool? result = saveFileDialog.ShowDialog();
            if (result == true) {
                textBlock1.Text = saveFileDialog.SafeFileName;
                using (Stream fileStream = saveFileDialog.OpenFile())
                using (StreamWriter sr = new StreamWriter(fileStream)) {
                    sr.Write(textBox1.Text);
                }
            }
        }
    }
}

OpenFileDialog と SaveFileDialogの2つのクラスは、Microsoft.Win32 名前空間にあり、WindowsFormsで利用できるコンポーネントとは別ものです。

このサンプルでは、OpenFileDialog, SaveFileDialog クラスの、OpenFileメソッドを使い ファイルをオープンしています。

Openボタンが押されると、OpenFileDialogを開き、選ばれたテキストファイルを読み込み その内容を TextBoxに表示しています。

Closeボタンが押されると、SaveFileDialogを開き、指定されたファイルにTextBoxの 内容を書き込んでいます。このクラスは、既存ファイルを選んだときには、上書きするかどうかのダイアログを出してくれます。

OpenSaveDialog1

OpenSaveDialog2

XAMLも一応載せておきます。

<Window x:Class="OpenFileSaveFileDialogSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="36" />
            <RowDefinition Height="30" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" >
            <Button Content="Open" Height="23" Margin="5" Name="buttonOpen"
                    Width="80"  Click="buttonOpen_Click" />
            <Button Content="Save" Height="23" HorizontalAlignment="Right"
                    Margin="5" Name="buttonClose" Width="80" Click="buttonClose_Click" />
        </StackPanel>
        <TextBlock Grid.Row="1" Height="23" Margin="5" Name="textBlock1" Text="" />
        <ScrollViewer Grid.Row="2" VerticalAlignment="Stretch" Margin="5,0,5,5"
                      Padding="3" >
            <TextBox Name="textBox1" TextWrapping="Wrap" AcceptsReturn="True" />
        </ScrollViewer>
    </Grid>
</Window>


WPFサンプル・目次
  
Posted by gushwell at 22:35Comments(0)TrackBack(0)

2013年09月10日

WPFサンプル:表示文字列を色付きやアンダーラインなどで修飾する

   このエントリーをはてなブックマークに追加 Clip to Evernote
TextBlockに表示する文字列はプレーンな文字列だけではなく、複数の書式をもった文字列を表示させることができます。

TextBlockFormat

アンダーラインを引くには、<Underline>と</Underline>で文字列をくくります。
ボールドにしたければ、<Bold> と </Bold>でくくります。
Run要素を使えば、背景色、文字色、フォントサイズも変更することができます。

以下、このサンプルのXAMLです。

<Window x:Class="TextBlockFormatedTextSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xml:lang="ja" >
    <Grid>
        <TextBlock HorizontalAlignment="Left" Margin="12,12,0,0" Width="350"
                   Name="textBlock1" Text="TextBlock" VerticalAlignment="Top"
                   TextWrapping="Wrap" xml:space="default">
            TextBlock内に、複数の書式を設定することができます。
            <Underline>アンダーライン</Underline>を引いたり、
            <Bold>太字</Bold> にしたりできます。
            <Run Foreground="Red">色を変更</Run> したり
            <Run FontSize="14" FontWeight="Bold" >サイズを変更する</Run> こともできます。
            <LineBreak />
            任意の場所で改行することもできます。
            <LineBreak />
            <Run TextDecorations="Strikethrough">取り消し線も引けます。</Run>
        </TextBlock>
    </Grid>
</Window>
ちなみに、xml:space="default" という指定をしています。規定値がdefaultであるため、 この場合は不要なのですが、この値を preserve にすると結果は大きく変わってきます。
興味のある方は、preserve にして実行してみてください。

WPFサンプル・目次
  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2013年08月25日

WPFサンプル:コマンドラインの引数を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
Mainメソッドが隠蔽されてしまっているWPFでも、コマンドラインから引数を受け取ることができます。
まず、App.xaml.cs に以下のプロパティとメソッドを追加します。

public partial class App : Application {
    public static string[] CommandLineArgs { get; private set; }
    private void Application_Startup(object sender, StartupEventArgs e) {
        if (e.Args.Length == 0)
            return;
        CommandLineArgs = e.Args;
    }
}

StartupEventArgsのArgsプロパティに、アプリケーションに渡されたコマンド ライン引数が 入ってきますので、これを Appクラスの CommandLineArgs プロパティに設定しています。
Appクラスは、Visual Studio が自動生成してくれるクラスで、ソリューションエクスプローラからは、App.xaml -> App.xaml.cs -> App とたどっていくことで、開くことができます。

CommandLineArgs プロパティはstaticプロパティですので、これで、どこからでもコマンドライン引数を参照することができるようになりました。

例えば、Button_Click イベントハンドラで、以下のようなコードを書けば、コマンド引数をListBoxに表示させることができます。

private void Button_Click(object sender, RoutedEventArgs e) {
    if (App.CommandLineArgs == null)
        return;
    foreach (string arg in App.CommandLineArgs) {
        this.listBox1.Items.Add(arg);
    }
}

※ バインディングせずに、あえて ListBox.ItemsにAddしています。

このプログラムが、Sample.exeだとすると、

C:\>Sample.exe Visual Studio 2013

とタイプして Sample.xeをたちあげ、ボタンをクリックすれば、以下のような 実行結果が得られます。

cmdlineargs

エクスプローラ上のSample.exeのアイコンに、ファイルをDrag&Dropしてsample.xeを起動すれば、 Drag&Dropされたファイルパスが、コマンドライン引数として渡されますから、 以下のように、ファイルパスを得ることができます。

cmdlineargs2
※ 3つのファイルをアイコン上にD&Dした例です。


ちなみに、このサンプルのXAMLは、以下のように定義しています。

<Window x:Class="CommandLineSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left"
                Margin="10,10,0,0" VerticalAlignment="Top"
                Width="75" Click="Button_Click"/>
        <ListBox HorizontalAlignment="Stretch" Height="200"
                 Margin="5,50,5,5" VerticalAlignment="Top"
                 Name="listBox1"/>
    </Grid>
</Window>


WPFサンプル・目次
  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2013年06月26日

WPFサンプル:プロパティ値の継承

   このエントリーをはてなブックマークに追加 Clip to Evernote
これまで多くのサンプルで示してきたように、XAMLでは Grid の中に StackPanel を配置したり、さらにその StackPanel の中に、Button を配置したりと、XAML で定義する UI 要素の構造は階層的になります。
この時、一部のプロパティについては、階層の上位で設定した値を、下位の要素に継承させることができます。

XAMLの例を示します。

<Window x:Class="PropertyValueInheritanceSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Name="stackPanel1" Width="150"
                TextElement.FontSize="20" TextElement.FontStyle="Italic"  
                TextBlock.TextAlignment="Right" Background="#FFFFD7D7" >
        <Button Content="Button" Name="button1" Width="90" />
        <TextBlock Name="textBlock1" Text="TextBlock1" />
        <TextBlock Name="textBlock2" Text="TextBlock2" />
        <TextBlock Name="textBlock3" Text="TextBlock3" />
        <Label Content="Label" Name="label1" />
        <CheckBox Content="CheckBox" Name="checkBox1" />
        <ListBox Height="100" Name="listBox1" Width="120">
            <ListBoxItem Content="Item1" />
            <ListBoxItem Content="Item3" />
            <ListBoxItem Content="Item2" />
        </ListBox>
    </StackPanel>
</Window>


TextElement.FontSize とTextElement.FontStyle をStackPanel に設定することで、その子要素である、各コントロールのFontSize, FontStyletが継承されていることが確認できます。
また、TextBlock.TextAlignmentで、TextBoxの表示を右詰めに設定しています。
TextElement.FontSize とTextElement.FontStyle なども添付プロパティの一種です。

以下がこのXAMLの実行結果です。

PropertyValueInheritance


WPFサンプル・目次
  
Posted by gushwell at 23:00Comments(0)TrackBack(0)