WPF的Window.ShowDialog方法返回一个可以为空的布尔值.那样做CommonDialog.ShowDialog.
现在,我理解这些将返回false的情况(用户单击取消或按下Esc),以及何时返回true(代码集Window.DialogResult为true,可能是为了响应OK单击).但是null?
我的第一个想法是单击标题栏的"关闭"按钮可能会返回null.但文档说明(我通过测试确认)标题栏关闭按钮被视为取消.
那么什么时候会Window.ShowDialog或者CommonDialog.ShowDialog永远返回null?
每当我创建新的WPF应用程序或WPF用户控件库时,该AssemblyInfo.cs文件都包含以下属性:
[assembly: ThemeInfo(
ResourceDictionaryLocation.None,
//where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly
//where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
Run Code Online (Sandbox Code Playgroud)
这个ThemeInfo属性是什么?如果我删除它会破坏任何东西吗?
我正在尝试以编程方式在XAML Metro应用程序中加载BitmapImage.这是我的代码:
var uri = new Uri("/Images/800x600/BackgroundTile.bmp", UriKind.RelativeOrAbsolute);
var imageSource = new BitmapImage(uri);
Run Code Online (Sandbox Code Playgroud)
第二行崩溃与System.ArgumentException:
给定的System.Uri无法转换为Windows.Foundation.Uri.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=215849.
该链接只是进入MSDN主页,所以没用.
我也尝试删除前导/,以防WinRT对相对URI有不同的期望,但我仍然得到相同的异常.
为什么我会为看似完全有效的URI获取此异常?
Windows命令提示符(cmd.exe)有一个可选/s参数,它修改/c(运行特定命令然后退出)或/k(运行特定命令然后显示shell提示符)的行为.这个/s参数显然与某些神秘的引用处理有关.
文档令人困惑,但据我所知,当你这样做cmd /csomething,并且something包含引号时,默认情况下cmd有时会删除这些引号,并/s告诉它不要管它们.
我不明白的是,当引用删除会破坏任何东西,因为这是唯一的时间/s("抑制默认的引用删除行为")是必要的.它只删除某些神秘条件下的引号,其中一个条件是/c必须是引号之后的第一个字符.因此,它不会删除参数周围的引号; 它要么删除你正在运行的EXE路径周围的引号,要么删除整个命令行周围的引号(或者可能在命令行的前半部分周围,这将是奇怪的).
cmd /c "c:\tools\foo.exe" arg1 arg2,则引号是不必要的,如果cmd想要删除它们,那很好.(如果路径在名称中有空格,它将不会删除它们 - 这是另一个神秘的规则.)我无法想象有任何理由抑制引用删除,所以/s似乎没必要.cmd /c "foo.exe arg1 arg2",那么似乎删除引号是必要的,因为foo.exe arg1 arg2系统上没有命名的EXE ; 所以看起来选择退出引用删除使用/s实际上会破坏事情.(实际上,它并没有破坏事情:cmd /s /c "foo.exe arg1 arg2"工作得很好.)是否有一些微妙的东西让/s我不知所措?什么时候有必要?什么时候会有什么不同?
我正在尝试编写一个Delphi控制台应用程序,为其标准输入创建一个TStream,为其标准输出创建另一个TStream.
(它将由主机应用程序启动,其输入和输出重定向到管道,并将二进制数据传入/传出该主机应用程序,因此TStream将比ReadLn/WriteLn更适合于该任务.)
如何在标准输入或标准输出上打开TStream?
我正在我的应用程序中使用RelayCommand.将代码放在viewmodel中非常棒,但是如何将键击绑定到我的命令?
RoutedUICommand具有InputGestures属性,当我按下击键时会自动调用该命令.(作为一个额外的好处,它甚至可以在MenuItem中显示击键.)不幸的是,RoutedUICommand的额外属性没有可重复使用的界面,所以我无法使RelayUICommand获得同样的魔力.
我已经尝试过使用InputBindings:
<Window.InputBindings>
<KeyBinding Key="PageUp" Command="{Binding SelectPreviousLayerCommand}"/>
</Window.InputBindings>
Run Code Online (Sandbox Code Playgroud)
但这会让我产生运行时异常,因为KeyBinding.Command不是依赖属性.(实际上,它抱怨的是KeyBinding甚至不是DependencyObject.)由于我的RelayCommand是我的ViewModel上的属性(与RoutedUICommand设计的静态字段相反),数据绑定是我所知道的唯一方式从XAML引用它.
你们怎么解决这个问题?将击键绑定到RelayCommand的最佳方法是什么?
我正在尝试将一个集合绑定到ItemsControl,将Canvas作为items面板,并将每个项目的Canvas.Left和Top绑定到项目对象上的属性.基本上我正在尝试重新创建我在博客上的这篇文章中描述的二维数据绑定,但这次是在WinRT而不是WPF.
由于ItemsControl将您的ItemTemplate内容包装在另一个UI元素(在WinRT的情况下为ContentPresenter)中,并且它是直接放置在items面板中的那些包装器/容器元素,因此必须在这些容器上设置Left和Top; 你不能只在DataTemplate中设置它们.在WPF中,使用ItemContainerStyle中的绑定很容易做到这一点,例如:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
<Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
但是当我在WinRT/XAML项目中尝试同样的事情时,我什么也得不到.甚至没有绑定错误.如果我对一个值进行硬编码,它就会起作用; 但是如果我使用绑定,则该属性将保持其默认值(零),并且"输出"窗口中不显示任何绑定错误.
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<!-- This works, so ItemContainerStyle does work in WinRT: -->
<Setter Property="Canvas.Left" Value="200"/>
<!-- But this silently fails, leaves Top as 0, and does not show
any binding errors in the debugger's Output window: -->
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
我已经验证了ContentPresenters确实有正确的DataContext(即集合项,而不是集合本身或其他时髦的东西),所以你认为这些绑定可以正常工作.但他们似乎甚至没有得到评估.如果我在其他地方放置了一个错误的绑定,并运行调试版本,我会在调试器的Output窗口中看到绑定错误; 但是如果我在ItemContainerStyle中引用了一个无意义的属性,则不会显示绑定错误.
这是一个更完整的例子,(据我所知)应该可以在WPF中正常工作,但是在WinRT中,所有内容都保留在原点:
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style …Run Code Online (Sandbox Code Playgroud) binding itemscontrol itemcontainerstyle windows-runtime winrt-xaml
在.NET 4.0中,Run.Text是可绑定的.所以我试着绑定它:
<Run Text="{Binding DisplayText}"/>
Run Code Online (Sandbox Code Playgroud)
但是当我运行时,我收到一个错误:"TwoWay或OneWayToSource绑定无法在'SomeNamespace.SomeClass'类型的只读属性'DisplayText'上工作."
我的DisplayText属性确实是只读的,但运行 - 运行也是如此,你无法编辑的TextBlocks.那么为什么我会收到这个错误?我用dotPeek挖掘了PresentationFramework,果然:
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof (string), typeof (Run),
(PropertyMetadata) new FrameworkPropertyMetadata((object) string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
new PropertyChangedCallback(Run.OnTextPropertyChanged),
new CoerceValueCallback(Run.CoerceText)));
Run Code Online (Sandbox Code Playgroud)
第四行,简称为day,指定Run.Text默认情况下应绑定双向,这没有任何意义,似乎是一个明显的设计错误.
当然,这很容易解决:
<Run Text="{Binding DisplayText, Mode=OneWay}"/>
Run Code Online (Sandbox Code Playgroud)
但我为什么要必须解决它?为什么默认情况下Run绑定双向?
我有一个创建一些任务的方法,然后在返回之前用WaitAll等待它们.问题是,如果这些任务被取消,那么WaitAll会抛出一个包含大量TaskCanceledException的AggregateException.
这意味着WaitAll将在两种不同的情况下抛出异常:
后者完全符合一个令人烦恼的例外的定义:它是一个完全非特殊情况下抛出的异常,所以我必须抓住它才能恢复正常的控制流程.幸运的是,它很容易捕获,对吧?只需添加catch (AggregateException)- 哦等等,这是在发生致命错误时被抛出的相同类型.
我需要在返回之前等待任务完成运行(我需要知道他们不再使用他们的数据库连接,文件句柄或其他任何东西),所以我确实需要WaitAll或类似的东西.如果任何任务出现故障,我确实希望这些异常作为未处理的异常传播.我只是不想要取消的例外.
如何防止WaitAll为已取消的任务抛出异常?
我正在尝试为AvalonEdit定义一些自定义突出显示规则.似乎没有任何相关的文档 - 有关于文件格式的一些文档,但没有关于如何在创建它之后实际加载和使用该定义的文档.
" 语法高亮 "维基页面(对于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像AvalonEdit对其内置定义一样.
我查看了加载其内置荧光笔的ICSharpCode.AvalonEdit项目中的代码,但实际的"资源加载"代码是在DefaultHighlightingManager.LoadHighlighting中完成的,这是私有的 - 为了使事情变得怪异,显然只在发布版本中调用.
我可以不停地摸索,从私有方法中复制/粘贴一些代码,并尝试将可能或可能不起作用的东西拼凑在一起,但似乎值得问一下:这样做的标准方法是什么?是否有推荐的方法让第三方代码从资源加载突出显示定义?
Daniel的回答给了我一个良好的开端,但你需要在传递给GetManifestResourceStream的字符串中包含命名空间名称 - 如果不这样做,你将得到一个NullReferenceException(因为它返回一个空流).
我最后将一个名为ResourceLoader的静态类添加到与.xshd文件相同的项目文件夹中,使用此方法:
public static IHighlightingDefinition LoadHighlightingDefinition(
string resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName))
using (var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
Run Code Online (Sandbox Code Playgroud)
然后我就可以打电话了ResourceLoader.LoadHighlightingDefinition("Name.xshd").
对于在家中跟随的任何人,.xshd文件需要将其Build Action设置为Embedded Resource.
wpf ×4
binding ×2
c# ×2
assemblyinfo ×1
avalonedit ×1
cancellation ×1
delphi ×1
itemscontrol ×1
key-bindings ×1
mvvm ×1
null ×1
showdialog ×1
stdin ×1
stdout ×1
themes ×1
tstream ×1
windows ×1
windows-8 ×1
winrt-xaml ×1
xaml ×1