Changeset 19390

Show
Ignore:
Timestamp:
09/16/08 23:30:38 (6 years ago)
Author:
coma2n
Message:

platform/silverlight/SilverlightMVC: モーダルダイアログ機能を追加

Location:
platform/silverlight/SilverlightMVC/trunk/src
Files:
3 added
7 modified

Legend:

Unmodified
Added
Removed
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvc/Mvc/Controllers/RootController.cs

    r19310 r19390  
    3737        #region fields 
    3838 
     39        /// <summary> 
     40        /// ルート要素 
     41        /// </summary> 
     42        private Grid layoutRoot; 
    3943        private UIElement startPage; 
    4044 
     
    5660            get { return startPage; } 
    5761            set { 
    58                 this.Content = (startPage = value); 
     62                // TODO 再考の必要あり 
     63                layoutRoot.Children.Clear(); 
     64                layoutRoot.Children.Add(value); 
     65 
     66                this.startPage = value; 
    5967            } 
     68        } 
     69 
     70        /// <summary> 
     71        /// ルート要素を取得します。 
     72        /// </summary> 
     73        internal Grid LayoutRoot { 
     74            get { return layoutRoot; } 
     75        } 
     76 
     77        #endregion 
     78 
     79        #region constructors 
     80 
     81        /// <summary> 
     82        /// 標準的なコンストラクタ 
     83        /// </summary> 
     84        public RootController() { 
     85            layoutRoot = new Grid(); 
     86 
     87            this.Content = layoutRoot; 
    6088        } 
    6189 
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvc/Mvc/Extensions.cs

    r19310 r19390  
    3232using Silverlight.Commons; 
    3333using Silverlight.Mvc.Controllers; 
     34using System.Windows.Shapes; 
     35using System.Windows.Media; 
    3436 
    3537#endregion 
     
    4042    /// </summary> 
    4143    public static class Extensions { 
     44 
     45        #region const 
     46 
     47        /// <summary> 
     48        /// DialogCallback 
     49        /// </summary> 
     50        private static readonly DependencyProperty DialogCallbackProperty = DependencyProperty.Register( 
     51            "DialogCallback", typeof(Action<DialogResult>), typeof(UserControl), 
     52            new PropertyMetadata((d, e) => { }) 
     53        ); 
     54        /// <summary> 
     55        /// DialogFrame 
     56        /// </summary> 
     57        private static readonly DependencyProperty DialogFrameProperty = DependencyProperty.Register( 
     58            "DialogFrame", typeof(Grid), typeof(UserControl), 
     59            new PropertyMetadata((d, e) => { }) 
     60        ); 
     61 
     62        #endregion 
    4263 
    4364        #region fields 
     
    148169        } 
    149170 
     171        /// <summary> 
     172        /// 指定したコンテンツを元にしてモーダルダイアログ(風のUI)を表示します。 
     173        /// </summary> 
     174        /// <param name="page">ページ</param> 
     175        /// <param name="dialogContent">コンテンツ</param> 
     176        /// <exception cref="ArgumentNullException">引数がnullの時</exception> 
     177        [DebuggerStepThrough] 
     178        public static void ShowDialog(this UserControl page, UIElement dialogContent) { ShowDialog(page, dialogContent, null); } 
     179        /// <summary> 
     180        /// 指定したコンテンツを元にしてモーダルダイアログ(風のUI)を表示します。 
     181        /// </summary> 
     182        /// <param name="page">ページ</param> 
     183        /// <param name="dialogContent">コンテンツ</param> 
     184        /// <param name="callback">ダイアログが閉じられた時のコールバック</param> 
     185        /// <exception cref="ArgumentNullException">引数がnullの時</exception> 
     186        public static void ShowDialog(this UserControl page, UIElement dialogContent, Action<DialogResult> callback) { 
     187            #region ArgumentValidation 
     188            ArgumentValidation.CheckForNullReference(page, "page"); 
     189            ArgumentValidation.CheckForNullReference(dialogContent, "dialogContent"); 
     190            #endregion 
     191 
     192            var layoutRoot = RootController.Current.LayoutRoot; 
     193 
     194            var dialogFrame = new Grid(); 
     195            var dialogBackground = new Rectangle { 
     196                Fill = new SolidColorBrush(Colors.Black), 
     197                Opacity = 0.4 
     198            }; 
     199            dialogBackground.MouseLeftButtonDown += (s, e) => { 
     200                layoutRoot.Children.Remove(dialogFrame); 
     201 
     202                if(callback != null) callback(DialogResult.Cancel); 
     203            }; 
     204            dialogContent.SetValue(DialogFrameProperty, dialogFrame); 
     205            dialogContent.SetValue(DialogCallbackProperty, callback); 
     206 
     207            dialogFrame.Children.Add(dialogBackground); 
     208            dialogFrame.Children.Add(dialogContent); 
     209 
     210            layoutRoot.Children.Add(dialogFrame); 
     211        } 
     212 
     213        /// <summary> 
     214        /// 現在、表示されているモーダルダイアログを閉じます。 
     215        /// </summary> 
     216        /// <param name="page">ページ</param> 
     217        /// <param name="result">ダイアログ結果</param> 
     218        /// <exception cref="ArgumentNullException">引数がnullの時</exception> 
     219        public static void CloseDialog(this UserControl page, DialogResult result) { 
     220            #region ArgumentValidation 
     221            ArgumentValidation.CheckForNullReference(page, "page"); 
     222            #endregion 
     223 
     224            var layoutRoot = RootController.Current.LayoutRoot; 
     225            var dialogFrame = page.GetValue(DialogFrameProperty) as Grid; 
     226 
     227            if(dialogFrame != null) { 
     228                page.ClearValue(DialogFrameProperty); 
     229 
     230                layoutRoot.Children.Remove(dialogFrame); 
     231 
     232                var callback = page.GetValue(DialogCallbackProperty) as Action<DialogResult>; 
     233 
     234                if(callback != null) { 
     235                    page.ClearValue(DialogCallbackProperty); 
     236 
     237                    callback(result); 
     238                } 
     239            } 
     240        } 
     241 
    150242        #endregion 
    151243 
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvc/SilverlightMvc.csproj

    r19310 r19390  
    5555    <Compile Include="Mvc\Controllers\ControllerAttribute.cs" /> 
    5656    <Compile Include="Mvc\Controllers\RootController.cs" /> 
     57    <Compile Include="Mvc\DialogResult.cs" /> 
    5758    <Compile Include="Mvc\Extensions.cs" /> 
    5859    <Compile Include="Properties\AssemblyInfo.cs" /> 
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvcSample/Page.xaml

    r19310 r19390  
    44    Width="400" Height="300"> 
    55     
    6     <StackPanel x:Name="LayoutRoot" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top"> 
     6    <StackPanel x:Name="LayoutRoot" 
     7                Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top"> 
    78        <TextBox x:Name="valueText" Width="150" Height="24" Margin="0,0,4,0" /> 
    89         
    9         <Button Width="60" Height="30" Content="click" Click="Button_Click" /> 
     10        <Button x:Name="refButton" Width="50" Height="28" Content="参照" Click="refButton_Click" /> 
    1011    </StackPanel> 
    1112     
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvcSample/Page.xaml.cs

    r19311 r19390  
    55 
    66using Silverlight.Mvc; 
    7 using Silverlight.Mvc.Controllers; 
    87 
    98namespace SilverlightMvcSample { 
    10  
    11     [Controller(typeof(PageController))] 
    129    public partial class Page : UserControl { 
    1310        public Page() { 
     
    1512        } 
    1613 
    17         private void Button_Click(object sender, RoutedEventArgs e) { 
    18             this.Action("ShowMessage", valueText.Text); ; 
     14        private void refButton_Click(object sender, RoutedEventArgs e) { 
     15            var dialog = new InputDialog(); 
     16 
     17            this.ShowDialog(dialog, r => { 
     18                if(r == DialogResult.OK) valueText.Text = dialog.Value; 
     19            }); 
    1920        } 
    2021    } 
    2122 
    22     public class PageController : Controller { 
    23  
    24         public ActionResult ShowMessage(string value) { 
    25             return Redirect(typeof(Page1), 
    26                 string.Format("ようこそ {0} さん", value) 
    27             ); 
    28         } 
    29  
    30     } 
    31  
    3223} 
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvcSample/SilverlightMvcSample.csproj

    r19310 r19390  
    5959      <DependentUpon>App.xaml</DependentUpon> 
    6060    </Compile> 
     61    <Compile Include="InputDialog.xaml.cs"> 
     62      <DependentUpon>InputDialog.xaml</DependentUpon> 
     63    </Compile> 
    6164    <Compile Include="Page.xaml.cs"> 
    6265      <DependentUpon>Page.xaml</DependentUpon> 
     
    7275      <SubType>Designer</SubType> 
    7376    </ApplicationDefinition> 
     77    <Page Include="InputDialog.xaml"> 
     78      <SubType>Designer</SubType> 
     79      <Generator>MSBuild:MarkupCompilePass1</Generator> 
     80    </Page> 
    7481    <Page Include="Page.xaml"> 
    7582      <Generator>MSBuild:MarkupCompilePass1</Generator> 
  • platform/silverlight/SilverlightMVC/trunk/src/SilverlightMvcSample/SilverlightMvcSample.csproj.user

    r19310 r19390  
    22  <ProjectExtensions> 
    33    <VisualStudio> 
    4       <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}" xmlns=""> 
     4      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}"> 
    55        <SilverlightProjectProperties> 
    66          <StartPageUrl>