2013年1月6日日曜日

コンテンツ(ListBox:選択)


ListBox(アイテム選択)クラス

クラスの定義は以下の通り

        Module Name: PresentationFramework.dll

       System.Windows.Controls.ListBox
         System.Windows.Controls.Primitives.Selector
           System.Windows.Controls.ItemsControl         <--これから派生されている(ItemsとItemsSrouceを保持)
             System.Windows.Controls.Control
               System.Windows.FrameworkElement
                 System.Windows.UIElement
                   System.Windows.Media.Visual
                     System.Windows.DependencyObject
                       System.Windows.Threading.DispatcherObject
                         System.Object


実装にあたって2つの形式がある

    ①ListBoxItemとして保持する(ラップする)
    ②直接配列として保持する

アイテム選択
     SelectedItem、SelectedItemsプロパティにより実現

        単数選択モード時
        >   [System.Windows.Controls.Primitives.Selector]::System.Object get_SelectedItem()
        >   [System.Windows.Controls.Primitives.Selector]::Void set_SelectedItem(System.Object)
        >   [System.Windows.Controls.Primitives.Selector]::System.Object SelectedItem

        複数選択モード時
        >   [System.Windows.Controls.ListBox]::System.Collections.IList get_SelectedItems()
        >   [System.Windows.Controls.ListBox]::System.Collections.IList SelectedItems
        >   [System.Windows.Controls.ListBox]::System.Windows.DependencyProperty SelectedItemsProperty


        どのアイテムを選んでいるか等のIndex処理で利用
        >   [System.Windows.Controls.Primitives.Selector]::Int32 get_SelectedIndex()
        >   [System.Windows.Controls.Primitives.Selector]::Void set_SelectedIndex(Int32)
        >   [System.Windows.Controls.Primitives.Selector]::Int32 SelectedIndex



実際に使ってみる

  1. PowershellだけでWPF表示(Powershell3.0でも2.0でも稼働)
  2. .Netframeworkは3.0以上が必要
  3. WPFの約束としてPowershellはSTAモードで動く必要あり
  4. 以下コードを
      ①Powershellコンソールにコピペして実行
      ②ISEで実行する時はすでにSTAモードなので適時修正して実行
        注意:ブラウザによってはコピペで行頭に余分な空白が出来てしまうことあり
               C:\temp> □'@   ← ここの行の行頭に空白あると動かない 

 ListBox(アイテム選択)の動作確認

#-------------------------------------------------------
if ($host.Version.Major -eq 3) {
    powershell.exe
} else {
    if ($host.Runspace.ApartmentState -eq "STA") {return}
    powershell.exe -version 2 -sta
}

$xaml_win = @'
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ListBox調査" Height="220" Width="250">

    <StackPanel>
        <ListBox Name="lstbxCats" HorizontalAlignment="Left" Width="100">
        <!--
        <ListBox Name="lstbxCats" HorizontalAlignment="Left" Width="100" SelectionMode="Multiple">
        -->
                <ListBoxItem>徳川家康</ListBoxItem>
                <ListBoxItem>織田信長</ListBoxItem>
                <ListBoxItem>豊臣秀吉</ListBoxItem>
        </ListBox>
        <Button Name="lstbxButton" HorizontalAlignment="Left" Padding="10,3" Margin="0,5">Enter</Button>
    </StackPanel>
</Window>
'@  # <--ブラウザによっては、コピペ時に行頭に空白出来る。空白削除する必要あり

$code = @'
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace MyButton
{
    public class lstbxButtonClass
    {
        public ListBox lstbxCats;
 
        public void subscribe(Button b, ListBox l)
        {
            b.Click += Button_Click;
            this.lstbxCats = l;
        }

        private void Button_Click( object sender, RoutedEventArgs e )
        {
            object obj = lstbxCats.SelectedItem;
            string selected = "";
            if ( obj == null )
            {
                selected = "アイテムは選択されていません";
            } else {
                selected = (string) ((ListBoxItem)obj).Content;
            }
            MessageBox.Show( selected, "Selected Item" );
        }
    }
}
'@  # <--ブラウザによっては、コピペ時に行頭に空白出来る。空白削除する必要あり

if ($host.Version.Major -eq 3) {
    Add-Type $code -ReferencedAssemblies @("WindowsBase","PresentationCore","PresentationFramework","system.xaml")
} else {
    Add-Type $code -ReferencedAssemblies @("WindowsBase","PresentationCore","PresentationFramework")
}
$form = [System.Windows.Markup.XamlReader]::Parse($xaml_win)
$m = new-object MyButton.lstbxButtonClass
$m.subscribe($form.findname("lstbxButton"), $form.findname("lstbxCats"))
[void]$form.showdialog()
exit


0 件のコメント:

コメントを投稿