小编Dav*_*mer的帖子

在WPF中指定宽度/高度作为资源

在WPF中是否有一种方法可以指定宽度/高度作为资源,以便可以在多种样式中重复使用,例如边距/填充?

wpf resources styles resourcedictionary

29
推荐指数
1
解决办法
2万
查看次数

窗口与用户控制

窗口和用户控件之间有区别吗?在我看来,这两者完全相同.那么我应该使用哪一个?何时使用?(我试过谷歌搜索这句话,我找不到任何东西)

wpf user-controls

29
推荐指数
3
解决办法
2万
查看次数

使用WPF验证规则并禁用"保存"按钮

在单击"保存"按钮之前,我有一个页面,其中几个文本框不能为空.

<TextBox...

                <TextBox.Text>
                    <Binding Path ="LastName" UpdateSourceTrigger="PropertyChanged">

                        <Binding.ValidationRules>
                            <local:StringRequiredValidationRule />
                        </Binding.ValidationRules>                              
                    </Binding>
                </TextBox.Text>
Run Code Online (Sandbox Code Playgroud)

我的规则有效.我的文本框周围有一个红色边框,直到我输入一个值.所以现在我想将此验证规则添加到我的其他文本框中.

现在,如何在页面没有错误之前禁用"保存"按钮?我不知道要检查什么是否有任何验证错误.

validation wpf validationrules

28
推荐指数
3
解决办法
5万
查看次数

如何在WPF中创建选取框进度条?

在Winforms中,我可以将进度条的ProgressBarStyle设置为Marqee,这样就可以在不必设置的情况下自行设置进度条,对于我不知道要采取多长时间的进程,没有好的方法报告回UI.

我想在WPF中做同样的事情,但我无法找到一种方法来避免托管winform进度条,这似乎适得其反.

我怎样才能在WPF中解决这个问题?我必须主持一个winform进度条吗?

wpf controls styles .net-3.5

28
推荐指数
2
解决办法
3万
查看次数

如何在XAML中实例化DataContext对象

我希望能够DataContext在XAML中为我的WPF StartupUri窗口创建对象的实例,而不是创建代码然后以DataContext编程方式设置属性.

主要原因是我不需要访问外部创建的对象,我不想仅仅为了设置而编写代码DataContext.

我确定我已经在某处读过如何DataContext在XAML中实例化对象,但我无法在任何常见的地方找到它...

c# wpf datacontext xaml

28
推荐指数
3
解决办法
4万
查看次数

WPF ControlTemplate:如何为TemplateBinding提供默认值?

我正在编写一个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)

wpf styles default controltemplate templatebinding

28
推荐指数
2
解决办法
2万
查看次数

从MemoryStream png,gif创建WPF BitmapImage

我在创建一个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)

wpf memorystream image webrequest bitmapimage

28
推荐指数
2
解决办法
6万
查看次数

在代码中获取上下文菜单的所有者

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 contextmenu parent

27
推荐指数
3
解决办法
2万
查看次数

WPF属性数据绑定以否定属性

有没有办法在WPF数据绑定中更改运行时的属性值.假设我的TextBox绑定到IsAdmin属性.无论如何我可以在XAML中更改该属性值!IsAdmin.

我只是想否定财产,所以Valueconverter可能是一个矫枉过正!

注意:不使用ValueConverter

data-binding wpf

27
推荐指数
1
解决办法
2万
查看次数

WPF DataGrid - 为什么是额外的列

我有一个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 user-controls wpfdatagrid c#-4.0

27
推荐指数
2
解决办法
2万
查看次数