update pr/58

This commit is contained in:
NaBian committed 2019-04-03 22:07:17 +08:00
1 parent e9329ef982
commit ce93f34467
8 files changed
+65 -112

No files matched your search

+10 -3
View File
@@ -1,4 +1,5 @@
using System.Windows.Controls;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using HandyControl.Interactivity;
@@ -10,8 +11,14 @@ namespace HandyControl.Controls
{
private Adorner _container;
// It can not be replaced with the FrameworkElement.IsLoaded property, which will be false when the dialog just created.
public bool IsClosed { get; private set; }
public static readonly DependencyProperty IsClosedProperty = DependencyProperty.Register(
"IsClosed", typeof(bool), typeof(Dialog), new PropertyMetadata(default(bool)));
public bool IsClosed
{
get => (bool) GetValue(IsClosedProperty);
internal set => SetValue(IsClosedProperty, value);
}
public Dialog()
{
+14 -31
View File
@@ -5,29 +5,29 @@ using HandyControl.Controls;
namespace HandyControl.Tools.Extension
{
public interface IDialogResultable
public interface IDialogResultable<T>
{
object Result { get; set; }
T Result { get; set; }
Action ClosureToken { get; set; }
Action CloseAction { get; set; }
}
public static class DialogExtension
{
public static Task<TResult> GetResultAsync<TResult>(this Dialog @this)
public static Task<TResult> GetResultAsync<TResult>(this Dialog dialog)
{
var tcs = new TaskCompletionSource<TResult>();
try
{
if (@this.IsClosed)
if (dialog.IsClosed)
{
SetResult();
}
else
{
@this.Unloaded += OnUnloaded;
@this.GetViewModel<IDialogResultable>().ClosureToken = @this.Close;
dialog.Unloaded += OnUnloaded;
dialog.GetViewModel<IDialogResultable<TResult>>().CloseAction = dialog.Close;
}
}
catch (Exception e)
@@ -40,7 +40,7 @@ namespace HandyControl.Tools.Extension
// ReSharper disable once ImplicitlyCapturedClosure
void OnUnloaded(object sender, RoutedEventArgs args)
{
@this.Unloaded -= OnUnloaded;
dialog.Unloaded -= OnUnloaded;
SetResult();
}
@@ -48,7 +48,7 @@ namespace HandyControl.Tools.Extension
{
try
{
tcs.TrySetResult(ExtractResult<TResult>(@this));
tcs.TrySetResult(dialog.GetViewModel<IDialogResultable<TResult>>().Result);
}
catch (Exception e)
{
@@ -57,16 +57,16 @@ namespace HandyControl.Tools.Extension
}
}
public static Dialog Initialize<TViewModel>(this Dialog @this, Action<TViewModel> configure)
public static Dialog Initialize<TViewModel>(this Dialog dialog, Action<TViewModel> configure)
{
configure?.Invoke(@this.GetViewModel<TViewModel>());
configure?.Invoke(dialog.GetViewModel<TViewModel>());
return @this;
return dialog;
}
public static TViewModel GetViewModel<TViewModel>(this Dialog @this)
public static TViewModel GetViewModel<TViewModel>(this Dialog dialog)
{
if (!(@this.Content is FrameworkElement frameworkElement))
if (!(dialog.Content is FrameworkElement frameworkElement))
throw new InvalidOperationException("The dialog is not a derived class of the FrameworkElement. ");
if (!(frameworkElement.DataContext is TViewModel viewModel))
@@ -74,22 +74,5 @@ namespace HandyControl.Tools.Extension
return viewModel;
}
private static TResult ExtractResult<TResult>(Dialog dialog)
{
var viewModelResult = dialog.GetViewModel<IDialogResultable>().Result;
switch (viewModelResult)
{
case TResult result:
return result;
case null when !typeof(TResult).IsValueType:
return default(TResult); // The default value of the value type may cause confusion, so should not help the user decide.
default:
throw new InvalidCastException("Could not cast " +
$"the {(viewModelResult != null ? $"{viewModelResult.GetType()} type" : "null value")} " +
$"to the {typeof(TResult)} type. ");
}
}
}
}
@@ -3,31 +3,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:langs="clr-namespace:HandyControlDemo.Properties.Langs"
xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl"
xmlns:interactivity="clr-namespace:HandyControl.Interactivity;assembly=HandyControl"
CornerRadius="10"
Width="400"
Height="247"
DataContext="{Binding Path=InteractiveDialog, Source={StaticResource Locator}}"
DataContext="{Binding InteractiveDialog, Source={StaticResource Locator}}"
Background="{DynamicResource RegionBrush}">
<controls:SimplePanel>
<TextBlock Style="{StaticResource TextBlockLargeBold}"
Text="{Binding Message}"
Margin="30"
VerticalAlignment="Top" />
<TextBox x:Name="TextBox"
Style="{StaticResource TextBoxBaseStyle}"
Text="{x:Static langs:Lang.PleaseInput}"
Margin="70"
VerticalAlignment="Top" />
<Button Width="120"
Height="32"
Command="{Binding CloseCommand}"
CommandParameter="{Binding Path=Text, ElementName=TextBox}"
Style="{StaticResource ButtonPrimary}"
Content="{x:Static langs:Lang.Ok}"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Margin="0 0 0 30" />
</controls:SimplePanel>
<StackPanel VerticalAlignment="Center" Margin="32">
<TextBlock Style="{StaticResource TextBlockLargeBold}" Text="{Binding Message}"/>
<TextBox Margin="0,32,0,0" Style="{StaticResource TextBoxExtend}" Text="{Binding Result,UpdateSourceTrigger=PropertyChanged}" controls:InfoElement.Placeholder="{x:Static langs:Lang.PleaseInput}"/>
<Button Width="120" Margin="0,32,0,0" Command="{Binding CloseCmd}" Style="{StaticResource ButtonPrimary}" Content="{x:Static langs:Lang.Ok}"/>
</StackPanel>
</Border>
@@ -1,8 +1,5 @@
namespace HandyControlDemo.UserControl.Basic
{
/// <summary>
/// Interaction logic for InteractiveDialog.xaml
/// </summary>
public partial class InteractiveDialog
{
public InteractiveDialog()
@@ -2,20 +2,15 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:langs="clr-namespace:HandyControlDemo.Properties.Langs"
xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl"
Background="{DynamicResource RegionBrush}"
DataContext="{Binding DialogDemo,Source={StaticResource Locator}}"
Width="300">
<StackPanel>
<Button Margin="32"
Content="{x:Static langs:Lang.TextDialog}"
Command="{Binding ShowTextCmd}" />
<TextBox x:Name="TextBox"
Style="{StaticResource TextBoxBaseStyle}"
Text="{Binding DialogResult}"
Margin="20 0"/>
<Button Margin="32"
Content="{x:Static langs:Lang.InteractiveDialog}"
Command="{Binding ShowInteractiveDialogCmd}"
CommandParameter="{Binding Path=Text, ElementName=TextBox}"/>
</StackPanel>
MinWidth="300"
DataContext="{Binding DialogDemo,Source={StaticResource Locator}}">
<controls:TransitioningContentControl>
<StackPanel Margin="32" VerticalAlignment="Center">
<Button Content="{x:Static langs:Lang.TextDialog}" Command="{Binding ShowTextCmd}" />
<TextBox Margin="0,32,0,0" Text="{Binding DialogResult,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TextBoxExtend}" controls:InfoElement.Placeholder="{x:Static langs:Lang.PleaseInput}"/>
<Button Margin="0,10,0,0" Content="{x:Static langs:Lang.InteractiveDialog}" Command="{Binding ShowInteractiveDialogCmd}"/>
</StackPanel>
</controls:TransitioningContentControl>
</UserControl>
@@ -1,36 +1,30 @@
using System;
using System.Windows.Input;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using HandyControl.Tools.Extension;
namespace HandyControlDemo.ViewModel.Basic
{
public class InteractiveDialogViewModel : ViewModelBase, IDialogResultable
public class InteractiveDialogViewModel : ViewModelBase, IDialogResultable<string>
{
public Action CloseAction { get; set; }
private string _result;
public string Result
{
get => _result;
set => Set(ref _result, value);
}
private string _message;
public object Result { get; set; }
public Action ClosureToken { get; set; }
public ICommand CloseCommand { get; }
public string Message
{
get => _message;
set => Set(ref _message, value);
}
public InteractiveDialogViewModel()
{
CloseCommand = new RelayCommand<string>(result =>
{
Result = result;
ClosureToken();
});
}
public RelayCommand CloseCmd => new Lazy<RelayCommand>(() => new RelayCommand(() => CloseAction?.Invoke())).Value;
}
}
@@ -1,10 +1,9 @@
using System;
using System.Windows.Input;
using System.Threading.Tasks;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using HandyControl.Controls;
using HandyControl.Tools.Extension;
using HandyControlDemo.Properties.Langs;
using HandyControlDemo.UserControl;
using HandyControlDemo.UserControl.Basic;
using HandyControlDemo.ViewModel.Basic;
@@ -15,32 +14,28 @@ namespace HandyControlDemo.ViewModel
{
private string _dialogResult;
public RelayCommand ShowTextCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(ShowText)).Value;
public string DialogResult
{
get => _dialogResult;
set => Set(ref _dialogResult, value);
}
public ICommand ShowInteractiveDialogCmd { get; }
public DialogDemoViewModel()
{
DialogResult = Lang.PleaseInput;
ShowInteractiveDialogCmd = new RelayCommand<string>(async message =>
{
DialogResult = await Dialog.Show<InteractiveDialog>()
.Initialize<InteractiveDialogViewModel>(vm => vm.Message = message)
.GetResultAsync<string>();
});
}
public RelayCommand ShowTextCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(ShowText)).Value;
private void ShowText()
{
Dialog.Show(new TextDialog());
}
public RelayCommand ShowInteractiveDialogCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(async () => await ShowInteractiveDialog())).Value;
private async Task ShowInteractiveDialog()
{
DialogResult = await Dialog.Show<InteractiveDialog>()
.Initialize<InteractiveDialogViewModel>(vm => vm.Message = DialogResult)
.GetResultAsync<string>();
}
}
}
@@ -1,5 +1,4 @@
using System;
using System.Reflection.Emit;
using System.Windows;
using CommonServiceLocator;
using GalaSoft.MvvmLight.Ioc;