我正在寻找一些指导和建议.我是wpf"6个月"的新手,在Windows窗体中开发了8年.
我仍然没有打开或使用blend.I可以看到这是一个设计师的工具,但从程序员的角度来看,这些天有很多东西需要学习,不知道我是否应该打扰.
我是否应该学习如何使用混合物?除了设计东西之外还融合了任何很酷的功能,并使它变得漂亮,这将使我作为一名wpf程序员的生活更轻松吗?
如果您认为我应该学会使用表达混合,请告诉我?
谢谢
我不知道如何为每个人提供一般性答案,所以我编辑了我的问题.
伙计们非常感谢你们所有的答案都很好.我一定会看到它,但不会深入.一个有趣的观点是看看如何构建控件并从中学习.在这个阶段我根本不做任何设计我只是一个纯粹的开发人员.再次感谢.
WPF中的ControlTemplates是否需要TargetType?我正在重新设置一些控件,并注意到comboboxitem,listiviewitem和listboxitem都具有相同的模板:
<ControlTemplate x:Key="ListBoxItemCT" TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd"
SnapsToDevicePixels="true"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
CornerRadius="1">
<ContentPresenter x:Name="cpItemContent"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
/>
</Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
是否可以删除TargetType并为所有三个模板设置一个模板?我试图这样做,但得到奇怪的错误和问题.我找不到ControlTemplates必须具有类型的任何特定参考.
我最近发现wpf以两种不同的方式处理INotifyPropertyChanged.我只是想知道是什么原因.
让我们采用正常的双向绑定验证为真.
如果你将一个属性从ui设置为viewmodel就像这样.
但如果你在viewmodel中设置了属性,它会像这样
我有一个WPF应用程序(英文),我想让用户选择不同的语言.我已经阅读了一些在运行时应用程序中更改语言的可能性,但我只想在安装时选择一种语言,而不是更改它.
您认为最快最容易的方法是开发不同版本的程序(仅更改文本语言)并让用户在安装过程中选择其中一个版本吗?可能重复代码只更改文本框或标签不是很优雅,但请注意我的应用程序用英语完成,我不需要在运行时更改语言.
在ZK框架中,在zul文件中我想调用javascript函数但它不会发生.
<a label="Click" onClick="popUp();">
Run Code Online (Sandbox Code Playgroud)
我也有popUp()函数.但是当我点击时
<script type="text/javascript">
function createPopUp(url)
{
var w = 600;
var h = 500;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
window.open(url,'name','scrollbars=yes,width='+w+', height='+h+', top='+top+', left='+left);
}
</script>
Run Code Online (Sandbox Code Playgroud)
但是,当我点击该链接时,它显示以下错误:
Sourced file: inline evaluation of: `` popUp();'' :
Command not found: popUp() : at Line: 13 :
in file: inline evaluation of: `` popUp();'' : popUp ( )
Run Code Online (Sandbox Code Playgroud) 我int在我的视图模型中有一个类型的属性,它绑定到a TextBox.一切正常,TwoWay绑定工作正常,除了一个案例 -
如果我清除了值TextBox,则不会调用属性setter,虽然清除了值TextBox,但属性仍保留先前的值.
有没有人遇到类似的问题?这有什么解决方法吗?
这是物业 -
public int MaxOccurrences
{
get
{
return this.maxOccurrences;
}
set
{
if (this.maxOccurrences != value)
{
this.maxOccurrences = value;
base.RaisePropertyChanged("MaxOccurrences");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何绑定xaml中的属性 -
<TextBox Text="{Binding Path=MaxOccurrences, Mode=TwoWay,
NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Center" Width="30" Margin="0,0,5,0"/>
Run Code Online (Sandbox Code Playgroud) 我写了简单的代码
public ObservableCollection<string> Names …
public Window1()
{
PutInDataIntoNames();
InitializeComponent();
this.listBox1.ItemsSource = Names;
}
Run Code Online (Sandbox Code Playgroud)
并在xaml
<Grid>
<ListBox Margin="10,11,10,16"
Name="listBox1"
Background="Black"
Foreground="Orange"
/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
然后我想在xaml中设置ItemsSource属性.为了做到这一点,我写了以下内容:
ItemsSource="{Binding Path=Names}"
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不起作用.你能解释为什么以及如何做到这一点吗?
所以我使用WPF 3.5和MVVM + DataTemplate方法在GUI上加载2个视图.我在内存分析中观察到,作为项目控件的项容器的一部分生成的项目被固定到内存中,即使在卸载视图后也不会获得GCed!
我刚刚运行测试,发现即使对于最简单的代码,它也是可重现的...你们可以自己检查一下.
XAML:
<Window x:Class="ContentControlVMTest.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ContentControlVMTest"
Title="Window2" Height="300" Width="300">
<DockPanel LastChildFill="True">
<CheckBox Click="CheckBox_Click" Content="Test1?"
DockPanel.Dock="Top" Margin="5"/>
<ContentControl x:Name="contentControl">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Test3}">
<TextBlock Text="{Binding C}" Margin="5"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Test1}">
<DockPanel LastChildFill="True" Margin="5">
<TextBlock Text="{Binding A}"
DockPanel.Dock="Top"
Margin="5"/>
<ListBox ItemsSource="{Binding Bs}"
DisplayMemberPath="B"
Margin="5"/>
</DockPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
public class Test3
{
public string C { get; set; }
}
public class Test2
{
public string B { get; set; }
}
public …Run Code Online (Sandbox Code Playgroud) 在我的WPF应用程序中,我使用的是Datagrid控件; 在控件定义中,我将ClipboardCopyMode属性定义为'IncludeHeader'.
<DataGrid Name="datagrid" ClipboardCopyMode="IncludeHeader">
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
有时,当我尝试从网格中复制任何数据时,我遇到HRESULT剪贴板崩溃错误 -
System.Runtime.InteropServices.COMException (0x800401D0):
OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))
Run Code Online (Sandbox Code Playgroud)
任何解决它的建议.我查看了其他帖子,主要是关于如何在明确使用Clipboard相关方法时如何处理这种情况,但没有相关的方法Datagrid.
这些WPF控件之间的主要区别是什么?
而当我应该使用ToolTip而不是Popup?
wpf ×9
.net ×5
c# ×3
xaml ×2
binding ×1
clipboard ×1
data-binding ×1
itemssource ×1
javascript ×1
listbox ×1
multilingual ×1
pinning ×1
popup ×1
silverlight ×1
targettype ×1
templates ×1
tooltip ×1
wpfdatagrid ×1
zk ×1