在WPF中,您可以使用以下命令检测它是否在设计模式下显示
DesignerProperties.GetIsInDesignMode
Run Code Online (Sandbox Code Playgroud)
Avalonia UI 中的等效项是什么
我正在编写一个简单的 MVVM 应用程序来研究正确的代码设计。完成它需要一段时间,但事情进展顺利。
我有一个关于如何处理事件的问题,以及代码应该放在 ViewModel 中还是代码隐藏中。
首先,绑定事件有两种技术,一种是使用 Blend Interactivity DLL 绑定到命令,另一种是使用MethodBindingExtension类。
使用交互 DLL,它允许使用 EventArgs 转换器将事件参数转换为只包含我们需要的数据的 UI 不可知类型。我不认为 MethodBindingExtension 这样做,但它更灵活。但是,当您需要设置事件 args 值时,这个事件 args 转换器将无济于事?(或者它可能允许将值转换回来,还没有检查这些类)
我喜欢使用 MethodBindingExtension,现在我的 ViewModel 中有这段代码。我不喜欢它的是我使用了特定的 UI 类型,这现在没什么大不了的,但从理论上讲,也许可以改进。
我该怎么办?将其移动到代码隐藏中?将它留在 ViewModel 中并使用 args 转换器?就这样放着?
public void Window_DropFile(DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files) {
ReadScriptFile(file);
}
}
}
public void Window_PreviewDragOver(DragEventArgs e) {
e.Effects = DragDropEffects.All;
e.Handled = true;
}
public void Header_PreviewLeftMouseButtonDown(IScriptViewModel sender, MouseButtonEventArgs e) {
if (sender == …Run Code Online (Sandbox Code Playgroud) 有没有办法获取 Avalonia 中所有窗口的列表?
WPF 中的等价物
Application.Current.Windows
Run Code Online (Sandbox Code Playgroud)
我的要求是根据其 DataContext 激活或关闭某个窗口。
如果我无法访问这样的列表;有没有办法跟踪窗口的创建和销毁以创建内部列表?
在 WPF 中,您将使用 TemplatePart 声明用于代码隐藏的 XAML 控件,然后使用 GetTemplateChild 获取对这些控件的引用。
如何在 Avalonia UI 中实现这一点?
关于项目结构的问题。到目前为止,我的 .NET Core 应用程序中有 3 个 ViewComponent。
在有关视图组件的 Microsoft 页面中,它们使用命名空间 ViewComponentSample.ViewComponents,但实际上,引擎在以下位置搜索视图组件
这意味着:在 Pages/Views/Models 旁边创建 ViewComponents 文件夹将不起作用,因为它找不到它们。
这意味着我将它们放在页面/共享中,对吗?虽然部分视图以“_”开头,但我应该将其保留给 ViewComponents 吗?
目前我已将其放在 Pages\Shared\ProductBox 中,视图位于 Pages\Shared\Components\ProductBox\Default 中。
然后还有 2 个问题。模型的命名空间和位置。
此 ProductBox 应该位于命名空间 MyWebsite.Pages.Shared 中,还是位于命名空间 MyWebsite.ViewComponents 中?
至于模型,我应该将其放在 Models 文件夹中还是视图组件旁边,因为它的代码与其直接相关?我不喜欢将组件分散到 3 个文件夹中(ViewComponent、Components\ProductBox 和 Models)。那里有 ProductBox 确实感觉有点奇怪,但它就像页面旁边有模型一样。
对于与视图组件关联的模型,到目前为止,我有 3 个组件使用完全不同的模型。
(起初我将 ViewComponent 类作为视图的模型传递,但这是一种代码味道,所以我将其更改为使用单独的模型类)
我做对了吗?我已经取得了进步,但想确保我走在正确的轨道上。
我有一个非常简单的方法,需要对它进行单元测试。
public static class ValidationExtensions
{
public static T GetValid<T>(this IConfiguration configuration)
{
var obj = configuration.Get<T>();
Validator.ValidateObject(obj, new ValidationContext(obj), true);
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是这configuration.Get<T>是静态扩展方法,不属于IConfiguration。我无法更改该静态方法的实现。
我在想,也许最简单的方法是创建内存配置提供程序?但是我不知道是否可以在不将其绑定到Web主机的情况下创建一个。
c# ×6
.net ×4
avaloniaui ×3
asp.net-core ×2
.net-core ×1
asp.net-mvc ×1
avalonia ×1
mvvm ×1
razor ×1
unit-testing ×1
wpf ×1
xaml ×1