[Silverlight] 取得ChildWindows 的值 (1)

2010/10/26

因為常常被問..
所以來筆記一下…
怎麼從ChildWindow 取得使用者選擇的值…
首先..我在MainPage 加入一個按鈕..跟一個Label..
讓Label 顯示ChildWindows 顯示的結果 畫面如下 :

sshot-63


所以案例是 點擊 btnGet1  的時候跳出ChildWindows 然後選擇值..關閉後把答案show 在lblResult1

然後我們做一個ChildWindows ..畫面如下..

sshot-60

sshot-64

XAML Code:

<controls:ChildWindow x:Class="GetChildWindowsValue.ChildWindow1"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           Width="200" Height="250" 
           Title="ChildWindow1">
    <Grid x:Name="LayoutRoot" Margin="2" Loaded="LayoutRoot_Loaded">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
        <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
        <ListBox Height="137" HorizontalAlignment="Left" Margin="32,23,0,0" Name="lstMain" VerticalAlignment="Top" Width="120" />
    </Grid>
</controls:ChildWindow>

C#:
using System.Windows;
using System.Windows.Controls;

namespace GetChildWindowsValue
{
    public partial class ChildWindow1 : ChildWindow
    {
        public ChildWindow1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 自訂的Property 
        /// </summary>
        public string  Result { get; set; }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            //如果使用者沒有選則,把此行為視為false 
            if(lstMain.SelectedItem!=null)
            {
                Result = this.lstMain.SelectedValue.ToString();
                this.DialogResult = true;   
            }
            else
            {
                this.DialogResult = false; 
            }
          
            

        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        //加入三個測試項目
        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            this.lstMain.Items.Add("當麻許");
            this.lstMain.Items.Add("六月羊");
            this.lstMain.Items.Add("Dracula");
        }
    }
}

其中比較特別的就是我開了一個叫做 Result 的Property 來裝選取的值…

回到MainPage..
在btnGet1   的Click 事件為:

private void btnGet1_Click(object sender, RoutedEventArgs e)
{
    ChildWindow1 childWindow1 = new ChildWindow1();
    //再關閉時加入事件取值
    childWindow1.Closed += new EventHandler(childWindow1_Closed);
    childWindow1.Show();

}

其中比較特別的是..我在childWindow1 的時候加入一個Close 的事件..


void childWindow1_Closed(object sender, EventArgs e)
{
           //如果childwindow 是選擇 ok 再取答案
           if ((sender as ChildWindow1).DialogResult == true)
           {
               //取得自訂的Result Property
               this.lblResult1.Content = (sender as ChildWindow1).Result;
           }
           else
           {
               this.lblResult1.Content = "您尚未選取";
           }

 }

在 Closed 的時候取出 自訂的 Result的值…
當然在 ChildWindow 我有去設定如果使用者沒有選擇…
也是視為他按了Cancel…

這樣就可以取到使用值 在ChildWindow 選的值..

當然這不是唯一做法..
如果有更好做法,也請各位先進指教..
只是很常有朋友問這問題就寫一篇…

讚一下:


案例預覽:



下載 :


0 意見:

程式 . 生活 . D小調.@2010 | Binary Design: One Winged Angel.