irihitech / Ursa.Avalonia

Ursa is a UI library for building cross-platform UIs with Avalonia UI.
https://irihitech.github.io/Ursa.Avalonia/
MIT License
683 stars 66 forks source link

关于dialog的疑问 #491

Open yyhLogin opened 6 days ago

yyhLogin commented 6 days ago

demo中的dialog可以正常运行,但是我自己写的时候并没有弹出dialog也没有报错,我有个疑问是我是初始化了一个类似九宫格的布局,想在每个小格子上弹出dialog,这个时候的hostId该怎么给,我是给的一个编号id,但是我看你的示例代码是在program.cs文件中 public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure<App>() .UseManagedSystemDialogs() .UsePlatformDetect() .With(new Win32PlatformOptions()) .LogToTrace(); 里注册的,还有别的地方需要注意的吗 这里是你的 hostId->public const string LocalHost = "LocalHost"; 我是这样写的 [ObservableProperty]private int _winNum;

rabbitism commented 6 days ago

还是需要知道你在设计怎样的布局,看描述不太懂。九宫格每个部分要弹出自己这部分独立的dialog吗?

yyhLogin commented 6 days ago

还是需要知道你在设计怎样的布局,看描述不太懂。九宫格每个部分要弹出自己这部分独立的dialog吗?

是的,比如视频监控窗口之类的,有具体的实现步骤的文档吗? 我把主window改成了</u:UrsaWindow>标签现在可以正常弹出下面这个 var result = await MessageBox.ShowOverlayAsync("Are you sure you want to exit?\n您确定要退出吗?", "Exit", button: MessageBoxButton.YesNo); 但是我九宫格内想这样弹什么都没出来 ` [RelayCommand] public async Task ShowDialogAsync() { var options = new OverlayDialogOptions() { FullScreen = false, HorizontalAnchor = HorizontalAnchor, VerticalAnchor = VerticalAnchor, HorizontalOffset = HorizontalOffset, VerticalOffset = VerticalOffset, Mode = DialogMode.None, Buttons = DialogButton.None, CanLightDismiss = false, CanDragMove = false, IsCloseButtonVisible = true, CanResize = true, }; await OverlayDialog.ShowModal<UsbDialog, UsbDialogViewModel>(new UsbDialogViewModel(), WinNum.ToString(), options: options); Debug.WriteLine("1111");

    }`
rabbitism commented 6 days ago

如果想要在一个局部区域显示,需要在这个局部区域最上层遮罩一个OverlayDialogHost,然后把这个Host的HostId设置为你需要的ID,然后在调用Dialog的时候传入这个ID。

https://github.com/irihitech/Ursa.Avalonia/blob/cd3d425ef72d1094ca8bf7fe5030036262467292/demo/Ursa.Demo/Pages/DialogDemo.axaml#L207

yyhLogin commented 6 days ago

如果想要在一个局部区域显示,需要在这个局部区域最上层遮罩一个OverlayDialogHost,然后把这个Host的HostId设置为你需要的ID,然后在调用Dialog的时候传入这个ID。

https://github.com/irihitech/Ursa.Avalonia/blob/cd3d425ef72d1094ca8bf7fe5030036262467292/demo/Ursa.Demo/Pages/DialogDemo.axaml#L207

这样写编译的时候会报错Unable to find suitable setter or adder for property HostId of type Ursa:Ursa.Controls.OverlayDialogHost for argument Avalonia.Markup.Xaml:Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindingExtension, available setter parameter lists are: System.String Line 10, position 23

rabbitism commented 6 days ago

哦,HostId确实不是AvaloniaProperty。您这9个也是通过ItemsSource生成吗?


换句话说,HostId是一个不能绑定的属性,只能赋予固定值或者静态变量

yyhLogin commented 6 days ago

哦,HostId确实不是AvaloniaProperty。您这9个也是通过ItemsSource生成吗?

嗯,其实也不是固定的9个,就是根据配置自定义生成的

yyhLogin commented 6 days ago

哦,HostId确实不是AvaloniaProperty。您这9个也是通过ItemsSource生成吗?

换句话说,HostId是一个不能绑定的属性,只能赋予固定值或者静态变量

我记得wpf的MaterialDesignThemes关于dialog有个api是IsOpen="{Binding HomeDialogIsOpen}",他可以根据isopen直接来弹出对话框,并且弹出框内容可以在直接在</materialDesign:DialogHost.DialogContent>里写,可以实现这个api吗

rabbitism commented 6 days ago

哦,HostId确实不是AvaloniaProperty。您这9个也是通过ItemsSource生成吗? 换句话说,HostId是一个不能绑定的属性,只能赋予固定值或者静态变量

我记得wpf的MaterialDesignThemes关于dialog有个api是IsOpen="{Binding HomeDialogIsOpen}",他可以根据isopen直接来弹出对话框,并且弹出框内容可以在直接在materialDesign:DialogHost.DialogContent</materialDesign:DialogHost.DialogContent>里写,可以实现这个api吗

Ursa Dialog主要解决的是多层次Dialog的问题,如果是普通的Dialog通常甚至都不需要单独设计控件,一个ContentControl然后Bool值控制IsVisible就可以了。不管如果确实需要的话可以增加这种控件,只是我在实际工作中完全不会去使用这样的控件。

yyhLogin commented 6 days ago

哦,HostId确实不是AvaloniaProperty。您这9个也是通过ItemsSource生成吗? 换句话说,HostId是一个不能绑定的属性,只能赋予固定值或者静态变量

我记得wpf的MaterialDesignThemes关于dialog有个api是IsOpen="{Binding HomeDialogIsOpen}",他可以根据isopen直接来弹出对话框,并且弹出框内容可以在直接在materialDesign:DialogHost.DialogContent</materialDesign:DialogHost.DialogContent>里写,可以实现这个api吗

Ursa Dialog主要解决的是多层次Dialog的问题,如果是普通的Dialog通常甚至都不需要单独设计控件,一个ContentControl然后Bool值控制IsVisible就可以了。不管如果确实需要的话可以增加这种控件,只是我在实际工作中完全不会去使用这样的控件。

我不是太专业的C#开发人员,能力有些不足,我现在主要是因为信创需要复刻之前的wpf程序,参照之前wpf的程序是这样实现

rabbitism commented 6 days ago

我想确定一件事情,在您之前的WPF项目中 Material Dialog在这种情况下也需要在Show的时候指定Identifier对吗?

yyhLogin commented 6 days ago

我想确定一件事情,在您之前的WPF项目中 Material Dialog在这种情况下也需要在Show的时候指定Identifier对吗? 并没有指定Identifier,DialogHost节点下可以定义DialogContent,也可以通过IsOpen来打开关闭,您这边可以参考下他的api设计