小编Gre*_*ski的帖子

依赖属性依赖于另一个

如何注册依赖属性,该属性的值是使用另一个依赖属性的值计算的?

因为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 dependency-properties linkage

23
推荐指数
1
解决办法
8619
查看次数

拉伸控件以填充ItemsControl

我正在尝试编写一个简单的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完成的.

.net wpf xaml itemscontrol

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

自定义WPF命名空间映射在Visual Studio 2010中失败

我刚刚安装了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,但这没有帮助.

谁能发现我做错了什么?如果没有,我会非常感谢为什么这可能会失败的建议.

编辑:根据评论,事实证明这只发生在从联网共享打开项目时.如果在本地驱动器上打开项目,则不会发生此问题.但是,我想能够在网络共享上打开它,所以我要打开这个问题.

wpf namespaces visual-studio-2010

18
推荐指数
2
解决办法
5216
查看次数

在Haskell数据类型中键入类

在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,FloatDouble值.理想情况下,我想限制它,以便x和y必须是相同的类型.

haskell types typeclass

15
推荐指数
2
解决办法
7430
查看次数

从AssemblyInfo后编译中读取AssemblyFileVersion

如何在编译后读取.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而不是从中检索值.

我怎样才能最好地完成这个?

.net versioning msbuild assemblies

12
推荐指数
1
解决办法
8154
查看次数

即使具有广泛的权限,PHP fopen()也会在文件上失败

我正在将我的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)

php apache permissions

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