如何注册依赖属性,该属性的值是使用另一个依赖属性的值计算的?
因为WPF在运行时绕过了.NET属性包装器,所以不应该在getter和setter中包含逻辑.解决方案通常是使用PropertyChangedCallbacks.但那些被宣布为静态的.
例如,完成这项设计任务的正确方法是什么:
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set
{
SetValue(TestBoolProperty, value);
TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY
}
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel));
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel));
Run Code Online (Sandbox Code Playgroud)
只要依赖关系不是循环的,是否有适当的方法来实现这一目标?
我正在尝试编写一个简单的WPF学习项目,该项目在可调整大小的主窗口中创建一组按钮.还有就是要成为一个Button每一个集合中的条目,该集合的内容可能会在运行时有所不同.我希望按钮能够填满整个窗口(例如1个按钮@ 100%宽度,2个按钮@ 50%宽度,3个按钮@ 33%宽度等等都在100%高度).我到目前为止所编写的简化版本是:
<ItemsControl x:Name="itemscontrolButtons" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Tag="{Binding}">
<TextBlock Text="{Binding}" />
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
...
List<string> listButtonTexts = new List<string>() { "Button1", "Button2" };
...
itemscontrolButtons.DataContext = listButtonTexts;
Run Code Online (Sandbox Code Playgroud)
这导致:

我一直无法使按钮拉伸以适应宽度,我尝试使用Grid而不是StackPanel没有结果.
然后,作为一个可选的改进,我将很感激如何调整它的建议,如果有这么多的按钮,他们不能正确地适合在一条线上或比一个阈值窄,它将包裹到一个新的线(从而减半按钮高度,如果从1到2行).
我想强调一下,我想知道如何以WPF的方式做到这一点.我意识到我可以使用窗口调整大小的消息并显式调整控件的大小,这就是我用MFC或WinForms完成它的方式,但从我读过的内容并不是如何用WPF完成的.
我刚刚安装了Visual Studio 2010并将我的一个Visual Studio 2008 WPF项目转换为测试.当项目构建并正确运行时,VS Designer无法处理我给出错误的自定义命名空间映射:
必须为不属于项目的XAML文件指定程序集.将此XAML文件添加到项目后重新打开此文件,关闭此文件并使用与其关联的项目重新打开它,或修改clr-namespace以包含程序集的名称.
有问题的命名空间是项目的一部分.Visual Studio 2008与XAML没有任何问题.所以我创建了一个名为Test1命名空间的新的空白WPF项目Test1.然后我编辑生成的MainWindow.xaml以添加单个映射local:
<Window x:Class="Test1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Test1"
Title="MainWindow" Height="350" Width="525">
<Grid />
</Window>
Run Code Online (Sandbox Code Playgroud)
这给出了同样的错误.而且,令人惊讶的是,谷歌报告没有错误的结果!我尝试了一些变体,如追加;assembly=或;assembly=Test1,但这没有帮助.
谁能发现我做错了什么?如果没有,我会非常感谢为什么这可能会失败的建议.
编辑:根据评论,事实证明这只发生在从联网共享打开项目时.如果在本地驱动器上打开项目,则不会发生此问题.但是,我想能够在网络共享上打开它,所以我要打开这个问题.
在Haskell中,可以像这样定义数据类型:
data Point1 = Point1 {
x :: Integer
, y :: Integer
}
Run Code Online (Sandbox Code Playgroud)
可以在数据类型中为变量使用类型类吗?如果是这样的话?我意识到有可能将它作为代数数据类型,对每种点都有不同的定义,但我想知道是否有办法以更紧凑和灵活的方式实现这一点.
例如,使用函数声明语法的伪代码行:
data Point2 = Point2 {
x :: (Num a, Ord a) => a
, y :: (Num a, Ord a) => a
}
Run Code Online (Sandbox Code Playgroud)
目标是允许在数据类型中存储Int,Integer,Float或Double值.理想情况下,我想限制它,以便x和y必须是相同的类型.
如何在编译后读取.csproj中的AssemblyFileVersion或其组件AssemblyFileMajorVersion,AssemblyFileMinorVersion,AssemblyFileBuildNumber,AssemblyFileRevision?
我尝试了以下从构建的程序集中提取信息:
<Target Name="AfterCompile">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output
TaskParameter="Assemblies"
ItemName="MyAssemblyIdentities"/>
</GetAssemblyIdentity>
<Message Text="AssemblyVersion = %(MyAssemblyIdentities.Version)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
但是,它检索AssemblyVersion而不是AssemblyFileVersion.对于后者,似乎没有记录的元数据条目.我也尝试过:
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks" />
<Target Name="AfterCompile">
<MSBuild.ExtensionPack.Framework.Assembly TaskAction="GetInfo" NetAssembly="$(TargetPath)">
<Output TaskParameter="OutputItems" ItemName="Info" />
</MSBuild.ExtensionPack.Framework.Assembly>
<Message Text="AssemblyFileVersion = %(Info.FileVersion)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然这会检索正确的值,但它也会锁定程序集,直到VS2008关闭.
坦率地说,我不想要什么,因为我宁愿直接从AssemblyInfo.cs读取信息.但是,我无法弄清楚如何做到这一点.我假设MSBuild Extensions中的AssemblyInfo是一种方式,但它似乎专注于写入AssemblyInfo而不是从中检索值.
我怎样才能最好地完成这个?
我正在将我的LAMP从我的Windows服务器迁移到运行Debian 6的VPS.大多数工作都正常,但是,其中一个PHP脚本无法写入其配置的日志文件.我无法确定原因,所以我写了一个新的,简单的,有人工作的PHP脚本来测试问题.
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
echo exec('whoami');
$log = fopen('/var/log/apache2/writetest/writetest.log', 'a');
if ($log != NULL)
{
fflush($log);
fclose($log);
$log = NULL;
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,结果失败了:
www-data Warning: fopen(/var/log/apache2/writetest/writetest.log): failed to open stream: Permission denied in /var/www/_admin/phpwritetest.php on line 5
Run Code Online (Sandbox Code Playgroud)
/var/log/apache2/writetest/writetest.log为chmod 777. www-data:www-data. touch.创建的.我跑来strace验证哪个进程正在执行open:
[pid 21931] lstat("/var/log/apache2/writetest/writetest.log", 0x7fff81677d30) = -1 EACCES (Permission denied)
[pid 21931] lstat("/var/log/apache2/writetest", 0x7fff81677b90) = -1 EACCES (Permission denied)
[pid 21931] open("/var/log/apache2/writetest/writetest.log", O_RDWR|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied) …Run Code Online (Sandbox Code Playgroud) wpf ×3
.net ×2
apache ×1
assemblies ×1
haskell ×1
itemscontrol ×1
linkage ×1
msbuild ×1
namespaces ×1
permissions ×1
php ×1
typeclass ×1
types ×1
versioning ×1
xaml ×1