很长一段时间以来,我一直坚持使用Windows Forms开发(从VB6开始,一直到C#.NET 4.5),而且我已经达到了Windows Forms可以做的极限,两者都使用纯.NET和本机代码的特殊效果.
我知道WPF是未来(目前),Windows Forms正在放慢成为一种被弃用的技术.
我曾经尝试过学习WPF和XAML,但是我遇到了WPF的新设计师......与Windows Forms设计师相比,它似乎很难使用...当然......这只是一个学习曲线,在某些时候,我打算继续学习WPF.
与此同时,我想知道.NET的WPF设计器是否有更适合Windows Forms开发人员的替代方案?
在WPF编程我的APP 3个月后,我第二次想到了我编写应用程序的方式(我知道这可能为时已晚).在我的APP上,我使用的是我的工具管理的软件的API.我的DAL包含16个类,其中3个是单例.我在.cs文件中有一些逻辑,而且XAML偏离正轨.我的问题是,我看到很多评论认为用WPF编写的应用程序应该使用MVVM,这将使代码更具可用性和可读性,我可以将我的代码转换为MVVM吗?什么是MVVM的实际含义(不是维基百科或手册定义)?
我也使用SQL查询,我读了一篇关于EF(实体框架)的论文,MVVM和EF可以在同一个项目中共存吗?
我知道我的问题是一个新手问题(我是新手:P)和一个抽象的问题,但我想知道我写的应用程序将是我此时写的最好的:)
我刚刚在C#.Net 4.0 WPF后台线程中意识到这不起作用(编译器错误):
Dispatcher.Invoke(DispatcherPriority.Normal, delegate()
{
// do stuff to UI
});
Run Code Online (Sandbox Code Playgroud)
从一些例子中我发现它必须像这样铸造:(Action)delegate().然而,在其他示例中,它被转换为其他类,例如System.Windows.Forms.MethodInvoker.
谁能告诉我上面这个例子究竟出了什么问题呢?我也尝试用其他方法重现它,但它总是在没有强制转换的情况下工作:
delegate void MyAction();
void Method1(MyAction a) {
// do stuff
}
void Method2(Action a) {
// do stuff
}
void Tests()
{
Method1(delegate()
{
// works
});
Method2(delegate()
{
// works
});
Method1(() =>
{
// works
});
Method2(() =>
{
// works
});
Method2(new Action(delegate()
{
// works
}));
new System.Threading.Thread(delegate()
{
// works
}).Start();
}
Run Code Online (Sandbox Code Playgroud)
那么最好的(最优雅的,更少冗余的)调用Dispatcher的方式是什么,并且它的特殊之处在于代理必须被转换?
我正在尝试 WPF 绑定。我写了一个小应用程序,但有问题,我的用户界面没有更新。这是我的代码:
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="345,258,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<TextBox x:Name="text" HorizontalAlignment="Left" Height="23" Margin="75,165,0,0" TextWrapping="Wrap" Text="{Binding Path=Count}" VerticalAlignment="Top" Width="311"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
和代码隐藏:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
MyClass mc;
public MainWindow()
{
InitializeComponent();
mc = new MyClass(this.Dispatcher);
text.DataContext = mc;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Task task = new Task(() =>
{
mc.StartCounting();
});
task.ContinueWith((previousTask) =>
{
},
TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
}
}
public class MyClass
{
public int Count { get; …Run Code Online (Sandbox Code Playgroud)