我正在尝试为我的应用程序加载首选项窗口,我希望最初禁用应用按钮,然后在更新首选项时,再次启用应用按钮.我有一些绑定到首选项对象的控件数据,发生的是在窗口加载后,组合框事件被触发.在一切稳定之后,是否有任何事件可以保证在最后发生?
这是我的代码的样子(窗口加载后始终启用应用按钮):
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_preferencesData = new PreferencesDataContext();
LayoutRoot.DataContext = _preferencesData;
ButtonApply.IsEnabled = false;
}
private void ComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
ButtonApply.IsEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)
是否有趣的是,这只发生在文本框和组合框中,而不是复选框或单选按钮.
我需要在代码中定义新的UI元素以及数据绑定,因为它们将在运行时之后实现.这是我想要做的简化版本.
数据模型:
public class AddressBook : INotifyPropertyChanged
{
private int _houseNumber;
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string sProp)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(sProp));
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码绑定:
AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123" …Run Code Online (Sandbox Code Playgroud) 对于我的WPF应用程序,我存储了几个用户设置,如窗口位置,窗口状态,以及是否显示欢迎对话框.问题是,虽然一切都在加载,但是当窗口被加载时我看到很多闪烁和闪烁,然后在读取设置后窗口最大化时更加闪烁.
我已经在使用内置的WPF PNG启动画面功能,但有没有办法完全隐藏所有窗口的渲染,直到所有内容都完全加载?
我正在尝试在C#WPF项目中开发一个触摸屏键盘控件,当TextBox获得焦点时它将是可见的,并且在TextBox失去焦点时隐藏.我见过的触摸屏键盘项目是通过将键盘定义为新窗口而不是控件来实现的.
对于我的应用程序,我真的希望将键盘作为主应用程序窗口中的控件.有没有办法允许单击按钮(在键盘控件上)而不会导致TextBox失去焦点?理想情况下,我想在克拉的当前位置放置一个角色.
这个例子无疑是一个有点人为但我正在做类似的事情.假设我有以下简单类:
public class Person
{
public string Name { get; set; }
public List<Alias> Aliases { get; set; }
}
public class Alias
{
public string AliasName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
让我们说我有一个带有LayoutRoot网格的Xaml和一个DataGrid,我想在DataGrid中访问Name属性而不是像这里的第二列中的Aliases属性:
<Grid x:Name="LayoutRoot" DataContext="PersonInstance">
<DataGrid ItemsSource="{Binding Aliases}">
<DataGrid.Columns>
<data:DataGridTextColumn Header="AliasName" Binding="{Binding AliasName, Mode=TwoWay}"/>
<data:DataGridTextColumn Header="Name" Binding="{Binding ../Name, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这是直觉上我将如何尝试绑定名称,但不用说,看起来很愚蠢.在指定路径时是否有类似的东西,或者您是否被迫获取LayoutRoot数据上下文的相对源.如果必须,最有效的方法是什么?
我有一个问题困扰了我一段时间了.在我发布的WPF/.NET 3.5产品上,由于以下错误,大约100个安装中的1个将无法运行该软件:
System.Windows.Markup.XamlParseException:对象初始化失败(ISupportInitialize.EndInit).定位的程序集的清单定义与程序集引用不匹配.(来自HRESULT的异常:0x80131040)标记文件'mainwindow.xaml'中对象'System.Windows.Controls.MenuItem'出错.
令人费解的是有三个原因:
这仅在大约1%到2%的安装中发生.
就我在这些系统上的.NET安装或操作系统而言,没有什么不寻常的.
使用默认框架引用(System.Windows.Controls.MenuItem)会发生这种情况
谁能想到可能的原因呢?
编辑:从"500"提示后,我能够在客户机器上运行Fusion日志查看器.在开发机器和所有其他测试机器上,对"PresentationFramework"和"PresentationFramework.Aero"进行了成功的绑定尝试,这是预期的.在客户端计算机上,有一个额外的绑定尝试失败(删除了不相关的行):
*** Assembly Binder Log Entry (2/3/2013 @ 1:18:44 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = PresentationFramework.Dawn TOP, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling …Run Code Online (Sandbox Code Playgroud) 我的 WPF UI 上有一些按钮,我还需要不时选择文件。我一直注意到奇怪的问题,当我双击文件对话框中的某个项目时,主用户界面上的按钮也会被单击。经过实验,似乎如果您在主 UI 上将文件对话框中的项目与其后面的按钮对齐,然后双击选择文件,它也会单击其后面的按钮。
有没有其他人注意到这一点,或者这只是我的 UI 布局方式的一个奇怪的错误?
wpf user-interface openfiledialog double-click savefiledialog
我试图从ObservableCollection派生一个类,我需要在每次反序列化此类的任何实例时运行一行代码.我的想法是这样做:
[Serializable]
public class ObservableCollection2<T> : ObservableCollection<T>, ISerializable
{
public ObservableCollection2()
: base()
{ }
public ObservableCollection2(SerializationInfo info, StreamingContext context)
: base(info, context)
{
// Put additional code here.
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法访问与序列化相关的那些基本方法.我是否被迫手动重写所有序列化?
我通过将StrokeDashOffset动画应用于Rectangle控件来实现"行进蚂蚁"样式动画.我希望动画在矩形可见时播放,但在隐藏时不占用额外的CPU周期.WPF足够智能,可以在隐藏受影响的控件时自动暂停动画吗?
很明显我在下面尝试做什么,但是我得到以下异常:
无法为"持续时间"值"自动"返回TimeSpan属性值.
我很沮丧地读到这个
在MediaOpened发生之后才能确定NaturalDuration.(链接)
这是否意味着我必须想出一个人工打开文件的方法,在单独的线程中等待媒体打开事件,然后仅在事件触发后返回持续时间?
public static int PlayAudio(string fileName)
{
try
{
myMediaPlayer.Stop();
myMediaPlayer.Close();
myMediaPlayer.Open(new Uri(filename));
myMediaPlayer.Play();
return myMediaPlayer.NaturalDuration.TimeSpan.Milliseconds;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return -1;
}
}
Run Code Online (Sandbox Code Playgroud) 我想将方法的引用传递给另一个方法并将其存储为变量.稍后,我想使用此引用来定义事件处理程序.
在创建事件处理程序时,会传递方法引用,如:
myButton.Click += new RoutedEventHandler(myButton_Click);
Run Code Online (Sandbox Code Playgroud)
如果你从intelliSense查看"RoutedEventHandler"的构造函数,它看起来像:
RoutedEventHandler(void(object, RoutedEventArgs))
Run Code Online (Sandbox Code Playgroud)
我想做的是将方法"myButton_Click"传递给另一个静态方法,然后在那里创建一个事件处理程序.如何将引用传递给静态方法?我尝试了以下但它不编译:
public class EventBuilder
{
private static void(object, RoutedEventArgs) _buttonClickHandler;
public static void EventBuilder(void(object, RoutedEventArgs) buttonClickHandler)
{
_buttonClickHandler = buttonClickHandler;
}
public static void EnableClickEvent()
{
myButton.Click += new RoutedEventHandler(_buttonClickHandler);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,本
wpf ×11
c# ×8
data-binding ×2
events ×2
reference ×2
.net ×1
animation ×1
audio ×1
double-click ×1
focus ×1
keyboard ×1
loading ×1
methods ×1
storyboard ×1
touchscreen ×1
visibility ×1
xaml ×1