在WPF中是否有一种方法可以指定宽度/高度作为资源,以便可以在多种样式中重复使用,例如边距/填充?
窗口和用户控件之间有区别吗?在我看来,这两者完全相同.那么我应该使用哪一个?何时使用?(我试过谷歌搜索这句话,我找不到任何东西)
在单击"保存"按钮之前,我有一个页面,其中几个文本框不能为空.
<TextBox...
<TextBox.Text>
<Binding Path ="LastName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:StringRequiredValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
Run Code Online (Sandbox Code Playgroud)
我的规则有效.我的文本框周围有一个红色边框,直到我输入一个值.所以现在我想将此验证规则添加到我的其他文本框中.
现在,如何在页面没有错误之前禁用"保存"按钮?我不知道要检查什么是否有任何验证错误.
在Winforms中,我可以将进度条的ProgressBarStyle设置为Marqee,这样就可以在不必设置的情况下自行设置进度条,对于我不知道要采取多长时间的进程,没有好的方法报告回UI.
我想在WPF中做同样的事情,但我无法找到一种方法来避免托管winform进度条,这似乎适得其反.
我怎样才能在WPF中解决这个问题?我必须主持一个winform进度条吗?
我希望能够DataContext在XAML中为我的WPF StartupUri窗口创建对象的实例,而不是创建代码然后以DataContext编程方式设置属性.
主要原因是我不需要访问外部创建的对象,我不想仅仅为了设置而编写代码DataContext.
我确定我已经在某处读过如何DataContext在XAML中实例化对象,但我无法在任何常见的地方找到它...
我正在编写一个WPF控件,它是Button的子类.然后我在Themes\generic.xaml中提供了一个默认样式,它看起来像这样(简化):
<Style TargetType="{x:Type WPFControls:MyButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
<Button
x:Name="PART_Button"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我希望用户有机会更改控件的背景,但如果他没有,我想提供默认值.我该怎么做?
当我在发布的代码中执行它时,Background和BorderBrush为null(=不存在),除非用户明确指定它们(这有效地强制用户总是提供一些值),但标准的Windows控件(如Button)提供了默认的外观,仍然可以由用户定制.如何在我的控制下做到这一点?
谢谢!
Michael Morton解决方案:
您可以在样式中提供默认设置:
<Style TargetType="{x:Type TestTemplate:MyButton}">
<Setter Property="Background" Value="Red" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TestTemplate:MyButton}">
<Button
x:Name="PART_Button"
IsEnabled="{TemplateBinding IsEnabled}"
Content="{TemplateBinding Content}"
Background="{TemplateBinding Background}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
用法:
<StackPanel>
<TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
<TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 我在创建一个BitmapImage来自MemoryStreamweb请求的png和gif字节时遇到了一些麻烦.这些字节似乎可以很好地下载,并且BitmapImage创建的对象没有问题,但是图像实际上并没有在我的UI上呈现.仅当下载的图像是png或gif类型时才会出现此问题(适用于jpeg).
以下是演示此问题的代码:
var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
Byte[] buffer = new Byte[webResponse.ContentLength];
stream.Read(buffer, 0, buffer.Length);
var byteStream = new System.IO.MemoryStream(buffer);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
byteStream.Close();
stream.Close();
return bi;
}
Run Code Online (Sandbox Code Playgroud)
为了测试Web请求是否正确获取字节,我尝试了以下操作,将字节保存到磁盘上的文件,然后使用a UriSource而不是a 加载图像StreamSource,它适用于所有图像类型:
var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
Byte[] buffer = new Byte[webResponse.ContentLength];
stream.Read(buffer, 0, buffer.Length);
string fName = "c:\\" + …Run Code Online (Sandbox Code Playgroud) 我ContextMenu喜欢这样的:
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="OnDeleteClicked" />
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我需要获得StackPanel拥有该实例的实例ContextMenu.我已经尝试过了:
private void OnDeleteClicked(object sender, System.Windows.RoutedEventArgs e)
{
FrameworkElement parent = e.OriginalSource as FrameworkElement;
while (!(parent is StackPanel))
{
parent = (FrameworkElement)LogicalTreeHelper.GetParent(parent);
}
}
Run Code Online (Sandbox Code Playgroud)
但是在获得ContextMenuPopup父级之后VisualTreeHelper,它变为null,与之相同,它在获取之前变为null StackPanel.有关如何做到这一点的任何想法?
谢谢!
有没有办法在WPF数据绑定中更改运行时的属性值.假设我的TextBox绑定到IsAdmin属性.无论如何我可以在XAML中更改该属性值!IsAdmin.
我只是想否定财产,所以Valueconverter可能是一个矫枉过正!
注意:不使用ValueConverter
我有一个DataGrid用于显示一些数据的WPF应用程序.当我运行该程序时,还有一个附加列,如下所示:
这是我在VS2010中设计时的样子
我已关闭数据网格上的AutoGenerateColumns并单独指定列(这是用户控件):
<Grid Margin="10,10,10,10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="EmployeeHours" AutoGenerateColumns="False" ItemsSource="{Binding EmployeeHoursLastWeek}" Width="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="100" />
<DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="75" />
<DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="100" />
<DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="100" />
<DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="100" />
</DataGrid.Columns>
</DataGrid>
<Button x:Name="ImportHoursButton" Content="Import Hours"
Command="{Binding ImportHoursCommand}"
Height="25" Width="100" Margin="10"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Grid.Row="1" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
我还有一个MainWindowView,它使用注入来显示视图(这是一个常规窗口):
<Window x:Class="Sidekick.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Sidekick.ViewModel"
xmlns:vw="clr-namespace:Sidekick.View"
Title="Sidekick"> …Run Code Online (Sandbox Code Playgroud) wpf ×10
styles ×3
.net-3.5 ×1
bitmapimage ×1
c# ×1
c#-4.0 ×1
contextmenu ×1
controls ×1
data-binding ×1
datacontext ×1
default ×1
image ×1
memorystream ×1
parent ×1
resources ×1
validation ×1
webrequest ×1
wpfdatagrid ×1
xaml ×1