我有一个带有MediaElement的WPF应用程序,我用它来运行视频.我不希望视频在加载时自动播放,因此我将LoadedBehavior设置为Manual.
<MediaElement LoadedBehavior="Manual"
Source="foo.wmv"
MediaOpened="videoElement_MediaOpened" />
Run Code Online (Sandbox Code Playgroud)
然而; 我希望元素在加载时显示视频的第一帧.这有什么神奇的方法吗?
我正在使用Prism实现事件聚合.我有几个模块,我希望他们每个人订阅事件,告诉他们什么时候被请求.我开始用shell中的订阅和发布者做一个简单的例子.没有问题.现在; 当我将订户移到我的模块时,他们不会被触发.更奇怪的是它实际上已经工作了几次 - 所有这些我都在断点中待定.所以在我看来是一些竞争条件,但我不明白为什么.
假设:我不需要在任何地方设置IEventAggregator - 例如在IoC容器中注册?这是内置于Prism中的,因此我只有一个事件聚合器实例,对吗?
所以,问题基本上是我应该如何/何时/何时设置我的订阅者.东西等有特定的订单吗?在我的简化示例中,我有一个模块MyModule.Bootstrapper会将MyModule添加到目录中 - 使其初始化:
catalog.AddModule(typeof(MyModule));
Run Code Online (Sandbox Code Playgroud)
MyModule将存储聚合器并使用它来订阅MyModuleRequestedEvent.它还使用菜单注册表在应用程序菜单中注册.这个想法是最终点击菜单应该触发事件 - 通知MyModule它已被请求.然后我希望MyModule有责任弄清楚该做些什么.
public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
_applicationMenu = menu;
_aggregator = aggregator;
}
public void Initialize()
{
var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
evnt.Subscribe(MyModuleRequested);
_applicationMenu.RegisterMenuItem("MyModule", evnt);
}
public void MyModuleRequested(bool b)
{
MessageBox.Show("MyModule requested");
}
Run Code Online (Sandbox Code Playgroud)
现在,我的shell中有一个按钮,可以发布此事件.shell在解析时获得相同的(?)事件聚合器.
public Shell(IEventAggregator aggregator)
{
InitializeComponent();
var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}
Run Code Online (Sandbox Code Playgroud)
笔记:
如果一个类有一个构造函数,它将一些值对象作为参数并依赖于它来进行初始化.如果此对象为null,它应该如何反应?
class SomeClass
{
private SomeData _data;
public SomeClass(SomeValueObject obj)
{
_data = obj.Data;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子,但总的来说:如果构造函数被赋予无效参数,那么它应该如何操作,因此无法正确构造?它应该只是返回而不进行任何初始化?将参数设置为某些默认值?抛出异常?别的什么?
我相信这个问题的答案是"它取决于",但有没有最佳实践等?
我正在开发一个WPF应用程序,并且有一个TextBlock,我想使用命令绑定来点击时触发命令.实现这一目标的最佳方法是什么?
TextBlock控件没有Command属性,但它有一个CommandManager.这是什么?它可以用于命令绑定吗?我已经看过许多其他控件以及这个属性..
我有一些可以使用的监督控制吗?是否建议使用按钮并将其设计为不像按钮?
是否有一些控件支持Command绑定,我可以围绕TextBlock?
我应该创建一个自定义控件,它基本上是一个TextBlock,但具有额外的属性Command和CommandArgument,它可以在例如MouseLeftButtonDown属性上启用命令绑定.
我在Wpf应用程序中设置图像源时遇到问题.我有一个Image,其中源绑定到DataContext对象的SourceUri属性,如下所示:
<Image Source="{Binding SourceUri}"></Image>
Run Code Online (Sandbox Code Playgroud)
现在,我不知道在我的对象的SourceUri属性上设置什么.设置完整的绝对路径("c:/etc/image.jpg")它显示得很好,但显然我想设置相对路径.我的图像存储在与我的应用程序文件夹位于同一文件夹中的文件夹中.最后这些图像可能来自任何地方,因此将它们添加到项目中确实不是一种选择.
我已经尝试了相对于应用程序文件夹的路径,并且相对于工作路径(debug-folder).还尝试使用"pack:// .."语法,但没有运气,但请注意,这不是任何一点.
关于我应该尝试的任何提示?
我编写了一个NHibernateSessionFactory类,它包含一个静态的Nhibernate ISessionFactory.这用于确保我们只有一个会话工厂,并且第一次调用OpenSession()我创建了一个实际的SessionFactory - 下次我使用相同的并打开一个会话.代码如下所示:
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个问题.我的应用程序分为客户端和服务器.Nhibernate的东西在服务器端.在启动时,我的客户端和服务器都希望通过一些将使用NhibernateSessionFactory的服务来访问数据库.结果是在请求来自客户端之前是否创建了_sessionFactory的竞争条件.如果不是它会失败..
我想我需要在NhibernateSessionFactory中使用某种排队或等待机制,但我不知道该怎么做.以前有人遇到过同样的问题吗?什么是最好的解决方案?
我正在使用Prism,它也是很好的Unity IoC容器.我是这个概念的新手,所以我还没有全力以赴.我现在要做的是使用IoC容器创建一个对象,但也传递一个额外的参数.请允许我用一个例子解释..:
我有一个接受命令对象的类.这是在IoC容器中注册的,因此它可以很好地处理它:
public class Person
{
public Person(IApplicationCommands commands) { .. }
..
}
Person person = _container.Resolve<Person>();
Run Code Online (Sandbox Code Playgroud)
现在 - 我想传递另一个论点 - 例如人的名字.但是,我仍然希望使用IoC容器来处理解析,从而从IoC容器中获取其他参数.但是将名称作为"自定义"参数传递.可以这样做吗?
public class Person
{
public Person(IApplicationCommands commands, string name) { .. }
..
}
string name = "John";
Person person = _container.Resolve<Person>(name); // ....??
Run Code Online (Sandbox Code Playgroud)
这个例子似乎不起作用,但有没有办法让它工作?或者Unity IoC容器是否要求在调用Resolve之前在容器中注册所有参数?
WPF中有哪些不同的触发器?它们如何不同,何时使用它们?
我见过以下触发器:
在我的WPF应用程序中,我有一个Canvas,在其中我做了一些绘图.之前我在后面的代码中处理了绘图,但现在我已经将所有内容都考虑在了ViewModel上.这给了我一些挑战..
我有一些持有笔划的InkPresenter对象.我在后面的代码中将它们作为子项添加到Canvas中 - 像这样:
// Build an InkPresenter:
var someInkPresenter = BuildInkPresenter(..);
//_myCanvas is the <Canvas> I want to display it in:
_myCanvas.Children.Add(someInkPresenter);
Run Code Online (Sandbox Code Playgroud)
现在 - 没有在持有_myCanvas的XAML的代码隐藏中构建InkPresenter我需要以不同的方式做到这一点.我想要做的是创建一个InkPresenter并将其添加到集合中:
public ObservableCollection<InkPresenter> Drawings;
Run Code Online (Sandbox Code Playgroud)
我现在的问题是如何将Canvas绑定到此ObservableCollection - 并在添加到集合时显示InkPresenters.我能以某种方式使用数据绑定来实现这一目标吗?
在我的WPF应用程序中,我有一些绘图功能.我已经使用Canvas和手动处理鼠标手势解决了这个问题,我还将绘制的Strokes(包装在InkPresenter中)添加到此Canvas中.
使用Blend我突然发现有一种叫做InkCanvas的东西.根据Blend的说法,这是一个"定义接收和显示墨水笔划的区域"的控件.,这听起来与我所做的相关.但是使用普通的Canvas,一切似乎都运行良好.
所以; InkCanvas与普通Canvas有何不同,为什么我应该选择使用它呢?
.net ×7
wpf ×7
c# ×2
prism ×2
canvas ×1
command ×1
constructor ×1
data-binding ×1
drawing ×1
image ×1
inkcanvas ×1
mediaelement ×1
nhibernate ×1
path ×1
triggers ×1
video ×1