小编H.B*_*.B.的帖子

如何从代码隐藏中访问控件模板的元素

我正在尝试访问内容控件的控件模板内的用户控件.特别:

  <ContentControl x:Name="MyList" >
        <ContentControl.Template>
            <ControlTemplate x:Name="MyControlTemplate">
                <Border RenderTransformOrigin="0,0" x:Name="border">
                    <UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="{Binding}" />
Run Code Online (Sandbox Code Playgroud)

我可以访问this.MyList,但它说明了找不到.MyControlName.在这种情况下如何从代码隐藏中访问MyControlName对象?

谢谢!

syntax wpf user-controls code-behind

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

代码背后的网格星大小

我有一个网格如下,

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.5*" />
        <RowDefinition Height="0.5*" />
    </Grid.RowDefinitions>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我如何给出Height = "0.5*"代码?

c# wpf grid xaml

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

如何在代码隐藏中恢复最小化的窗口?

这有点是一个平凡的问题,但在我看来,在WPF中没有内置的方法.似乎只有WindowState作为枚举的属性没有帮助,因为我无法判断窗口是否在最小化之前处于NormalMaximized状态.

单击任务栏图标时,窗口正在按预期恢复,假设其先前状态,但我似乎无法找到任何已定义的方法.

所以我一直想知道我是否只是缺少一些东西,或者我是否需要使用一些自定义交互逻辑.

(我将发布我当前的解决方案作为答案)

wpf state window restore minimize

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

如何让WPF TextBlock在多行显示我的文本?

我有一个wpf窗口,其中我有一个带有两个视口的stackpanel - 每个视口中都有一个文本块.

<Grid>
    <StackPanel VerticalAlignment="Center" Orientation="Vertical" >
        <Viewbox Margin="100,0,100,0">
            <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/>
        </Viewbox>
        <Viewbox Margin="150,0,150,0">
            <TextBlock x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" />
        </Viewbox>
    </StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是顶部文本块是带有更大文本的标题.第二个文本块是具有较小文本的子标题.无论标题或子标题有多少文本,字体都应该动态变小/变大.我的问题是我希望副标题是固定宽度.这意味着,字体应该是标题的百分比(70%)并换行到多行,具体取决于我有多少文本.我附上了我到目前为止的代码......我错过了那个副标题,无法弄清楚是什么.干杯

编辑 基本上我想要实现的是子标题包装文本所以它可以向下扩展它,字体是标题的70% - 无论字体有多大.

wpf xaml

41
推荐指数
3
解决办法
10万
查看次数

ValueConversionAttribute类的重点是什么?

这个属性有什么意义?添加它之后,我仍然需要对值对象进行强制转换.

[ValueConversion(sourceType: typeof(double), targetType: typeof(string))]
public class SpeedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var speed = (double)value;
Run Code Online (Sandbox Code Playgroud)

它仅用于代码可读性吗?因为当我在xaml中将绑定的路径更改为String时,Visual Studio不会发出有关错误类型的警告,并且仅在转换时抛出异常,因此即使在编译时错误捕获也不会产生异常.我也可以将强制转换为字符串,尽管它与此属性冲突,但不会抛出任何警告.

c# wpf ivalueconverter

41
推荐指数
2
解决办法
7669
查看次数

如何在运行时检查操作系统版本,例如Windows或Linux,而不使用条件编译语句

有谁知道如何确定你的c#代码运行的平台,例如它是在linux或windows上运行,以便我可以在运行时执行不同的代码.

我有一个ac#windows应用程序,我想构建目标Windows和Linux平台.

到目前为止,我创建了两个指向同一组源代码文件的项目文件.然后,我使用条件编译语句之一称为LINUX的项目.

在实际代码中存在差异的情况下,我使用条件编译语句使用编码语句,例如

#if (LINUX)
 ' do something
#endif
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我真的不想拥有2个项目文件.

提前致谢.

c# windows visual-studio-2008 winforms

39
推荐指数
5
解决办法
4万
查看次数

如何将颜色代码转换为media.brush?

我有一个矩形,我想用一种颜色填充.当我写Fill = "#FFFFFF90"它时显示一个错误:

无法将类型'string'隐式转换为'System.Windows.Media.Brush

请给我一些建议.

c# wpf

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

如何在TabControl中的选项卡项中保留控件状态

我是WPF的新手,试图建立一个项目,该项目遵循Josh Smith描述模型 - 视图 - 视图模型设计模式的优秀文章的建议.

使用Josh的示例代码作为基础,我创建了一个包含许多"工作区"的简单应用程序,每个工作区由TabControl中的选项卡表示.在我的应用程序中,工作空间是一个文档编辑器,它允许通过TreeView控件操作分层文档.

虽然我已成功打开多个工作区并在绑定的TreeView控件中查看其文档内容,但我发现TreeView在选项卡之间切换时"忘记"其状态.例如,如果Tab1中的TreeView部分展开,则在切换到Tab2并返回到Tab1后,它将显示为完全折叠.此行为似乎适用于所有控件的控件状态的所有方面.

经过一些实验,我意识到我可以通过将每个控件状态属性显式绑定到底层ViewModel上的专用属性来保留TabItem中的状态.然而,这似乎是很多额外的工作,当我只是希望我的所有控件在工作区之间切换时记住它们的状态.

我想我错过了一些简单的东西,但我不知道在哪里寻找答案.任何指导都将非常感谢.

蒂姆,谢谢

更新:

根据要求,我将尝试发布一些演示此问题的代码.但是,由于作为TreeView基础的数据很复杂,我将发布一个展示相同symtoms的简化示例.这是主窗口中的XAML:

<TabControl IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=Docs}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding Path=Name}" />
        </DataTemplate>
    </TabControl.ItemTemplate>

    <TabControl.ContentTemplate>
        <DataTemplate>
            <view:DocumentView />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

上面的XAML正确绑定到DocumentViewModel的ObservableCollection,其中每个成员都通过DocumentView呈现.

为了简化这个例子,我从DocumentView中删除了TreeView(如上所述),并将其替换为包含3个固定标签的TabControl:

<TabControl>
    <TabItem Header="A" />
    <TabItem Header="B" />
    <TabItem Header="C" />
</TabControl>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,DocumentView和DocumentViewModel之间没有绑定.运行代码时,内部TabControl在切换外部TabControl时无法记住其选择.

但是,如果我显式绑定内部TabControl的SelectedIndex属性...

<TabControl SelectedIndex="{Binding Path=SelectedDocumentIndex}">
    <TabItem Header="A" />
    <TabItem Header="B" />
    <TabItem Header="C" />
</TabControl>
Run Code Online (Sandbox Code Playgroud)

...到DocumentViewModel上的相应虚拟属性...

public int SelecteDocumentIndex { get; set; }
Run Code Online (Sandbox Code Playgroud)

...内部标签能够记住它的选择.

我知道我可以通过将这种技术应用到每个控件的每个视觉属性来有效地解决我的问题,但我希望有一个更优雅的解决方案.

wpf binding state tabcontrol mvvm

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

Grid的SharedSizeGroup和*大小调整

我有一个用户控件,称之为UserControl,它有一个包含以下列定义的网格:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
            <ColumnDefinition Width="*" SharedSizeGroup="C"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="D"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="E"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="F"/>
            <ColumnDefinition Width="110" SharedSizeGroup="G"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="H"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="I"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="J"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="K"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="L"/>
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)

我还有MainWindow,它包含一个网格本身,在网格上定义了以下属性:

Grid.IsSharedSizeScope="True"
Run Code Online (Sandbox Code Playgroud)

现在,我在MainWindow的网格中添加了几个UserControl(每个都是一个单独的行).我的目标是让不同UserControls的每个列宽保持同步.除了一件事,使用SharedSizeGroup时一切正常.似乎任何宽度为*的列都不会表现得如此.看起来*列宽度设置为好像它们是Auto.

SharedSizeGroup和*大小调整是否有任何限制/问题?这似乎是保持列宽度同步的最佳方法,但我似乎无法解决这个问题.

谢谢.

wpf grid layout xaml wpf-controls

38
推荐指数
1
解决办法
4万
查看次数

ElementName绑定失败

我有以下XAML:

<Grid>
    <Grid.RowDefinitions>
        ...
    </Grid.RowDefinitions>
    <DataGrid Grid.Row="0" ...>
        <DataGrid.Columns>
            ...
        </DataGrid.Columns>
    </DataGrid>

    <DockPanel Grid.Row="2">
        <CheckBox x:Name="DisplayMarkers" DockPanel.Dock="Top" Content="Display Data Points?"
                Margin="8,5,0,5" d:LayoutOverrides="Height" HorizontalAlignment="Left" IsChecked="False" />
        <vf:Chart DockPanel.Dock="Top" ScrollingEnabled="False" ZoomingEnabled="True" ToolBarEnabled="True">
            <vf:DataSeries AxisYType="Secondary" RenderAs="Line" DataSource="{Binding CdTeRoughnessList}"
                    XValueType="DateTime"
                    MarkerEnabled="{Binding ElementName=DisplayMarkers, Path=IsChecked}" Color="Navy"
                    LegendText="Roughness Std. Dev.">
Run Code Online (Sandbox Code Playgroud)

此绑定失败: MarkerEnabled="{Binding ElementName=DisplayMarkers, Path=IsChecked}"

我正在尝试绑定到我的Checkbox上名为'DisplayMarkers'的IsChecked属性.当我运行它时,在VS 2010的调试模式下,输出窗口显示绑定失败.它找不到名为'Checkbox'的元素谁能告诉我为什么?

我从VS得到的错误是:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 

    'ElementName=DisplayMarkers'. BindingExpression:Path=IsChecked; DataItem=null; target element is 'DataSeries' (Name=''); target property is 'MarkerEnabled' (type 'Nullable`1')
Run Code Online (Sandbox Code Playgroud)

data-binding wpf xaml

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