小编Onu*_*nur的帖子

ScrollViewer中的用户控件不会在WPF中滚动

我在主窗口中有以下代码(缩写):

虽然我设置了滚动条可见性和CanContentScroll属性,但它不会滚动.我认为它与我的用户控件有关.

<Window>
   <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
       <TabControl  Grid.Column="0" Grid.Row="0"  HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
          <TabItem Header="TEST">
            <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
            <my:MY_USER_CONTROL  x:Name="myUserControl"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  ScrollViewer.CanContentScroll="True" />
            </ScrollViewer>
        </TabItem>
      </TabControl>
      <Button Grid.Column="0"  Grid.Row="2" >a button</Button>
      <WrapPanel Grid.Column="0" Grid.Row="3" >
      </WrapPanel>
    </Grid>
  </Window>
Run Code Online (Sandbox Code Playgroud)

我的用户控件的缩写结构:

<UserControl>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="183*" />
            <ColumnDefinition Width="117*" />
        </Grid.ColumnDefinitions>
        <TreeView ItemsSource="{Binding Children}" Grid.ColumnSpan="2">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">

                    <Setter Property="IsExpanded" …
Run Code Online (Sandbox Code Playgroud)

wpf xaml user-controls scrollviewer

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

如何为WPF TreeView设置DataTemplate以显示列表的所有元素?

我想在WPF中使用TreeViews可视化以下数据结构:

class MyDataContext
{
    ICollectionView Outers {get;set;}
    //...
}

class Outer
{
    string Name {get;set;}
    IEnumberable<Inner> Actions {get;set;} 
}


class Inner
{
    string Description {get;set;}
    Command OnClick {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的尝试:

<!-- DataContext is MyDataContext at this  point -->
<TreeView ItemsSource="{Binding Path=Outers}">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type myns:Outer}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name}"/>

                <TreeView ItemsSource="{Binding Path=Actions}" >
                    <DataTemplate DataType="{x:Type myns:Inner}">
                        <Button Command={Binding Path=OnClick}>
                            <TextBlock Text="{Binding Path=Description}"/>
                        </Button>
                    </DataTemplate>
                </TreeView>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

由于我得到以下信息,因此访问此类访问有问题InvalidOperationException:

Operation is not valid while ItemsSource is …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf treeview datatemplate

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

动态依赖注入

第二种方法

我有一系列应用程序,它们提供了一组可扩展(即非固定)变量,可供各种插件使用。

例子是:

  1. 日志事件的来源
  2. 计算结果的来源
  3. 系统资源使用的来源
  4. 绩效指标的来源
  5. ...

插件可以使用这些的任意组合。

示例插件可以是:

  • 自定义错误记录器,使用 1.
  • 自定义统计模块,使用 2.
  • 使用 3. 和 4. 的性能工具。

我想要实现的是

  • 给出可以使用的插件列表,给定此应用程序中存在的一组变量(当没有日志事件源时,您应该无法选择自定义错误记录器)。
  • 获得一种简单且安全的使用方式将变量传递给插件,这样就不会因为缺少变量而出现运行时错误。

一个好处是允许插件可选地需要一个变量,例如一个插件需要 4. 并且可选地使用 3. 如果可用(但也可用其他情况)。

第一种方法

我想实现某种“动态依赖注入”。让我用一个用例来解释它。

我正在构建一组将用于一系列应用程序的库。每个应用程序都可以提供一组不同的变量,这些变量可供某些需要这些变量的“处理程序”使用。根据具体的可用变量,必须确定可用处理程序的数量,因为处理程序只有在可以访问所有必需变量时才能使用。此外,我正在寻找一种使调用尽可能安全的方法。编译时可能是不可能的,但是“检查一次,之后永远不会失败”就可以了。

下面是第一张草图。在这个阶段,一切都还可以改变。

class DynamicDependencyInjectionTest
{
    private ISomeAlwaysPresentClass a;
    private ISomeOptionalClass optionA;
    private ISomeOtherOptionalClass optionB;
    private ISomeMultipleOption[] multi;

    private IDependentFunction dependentFunction;

    void InvokeDependency()
    {
        // the number of available dependencies varies.
        // some could be guaranteed, others are optional, some maybe have several instances
        var availableDependencies = new IDependencyBase[] {a, optionA, optionB}.Concat(multi).ToArray(); …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection dynamic

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

如何比较深层嵌套的歧视联盟?

我想单元测试一个返回a的函数Result(见下文).

我的问题是:如何轻松检查结果在数值上是否等于预期值?

这是完全匹配的版本.

type QuadraticResult =
    | ComplexResult of  Complex * Complex
    | DoubleResult of float
    | TwoResults of float * float


type Result=
    | QuadraticResult of QuadraticResult
    | LinearResult of LinearFormulaSolver.Result

/// Solves a x² + bx + c = 0
let Compute (a,b,c) : Result =



[<Fact>]
member test.``the solution for x² = 0.0 is a double 0.0`` ()=
    let result = Compute (1.0, 0.0, 0.0)
    let expected = Result.QuadraticResult (DoubleResult 0.0)

    // only exact match, …
Run Code Online (Sandbox Code Playgroud)

comparison f# discriminated-union

3
推荐指数
1
解决办法
145
查看次数

当重命名文件很常见时,替代git cherry-pick

我想挑选从分支到另一个分支的单一提交.我希望文件重命名很常见,但仍希望能够在没有人为干预的情况下应用更改.

由于内置的​​cherry-pick命令没有接缝来检测重命名(至少在我的测试用例中),特别是与修改重命名的文件结合使用时.

我尝试了一下,最后想出了一个涉及两个rebase操作的解决方案.

让我们假设我有一个名为target的分支指向我想要应用cherry-pick的提交.我想要挑选的提交由名为source的分支指向.

然后我执行以下命令:

  1. create branch sourceTemp指向与源相同的提交(因为我想保留分支源)
  2. git rebase --strategy="recursive" --strategy-option="rename-threshold=30" target sourceTemp (可能使用另一个阈值;测试文件非常小,因此更改相对较大)
  3. git rebase --onto target sourceTemp~ sourceTemp

这仅适用于分支源中最后一次提交引用到目标的更改.

我也把测试放在github上:

https://github.com/fraschfn/cherry-pick

我想知道的是,如果这种方法是可行的,或者只是在我简单的测试设置中有效的话!

更新:替代方法

我将补丁重新绑定到目标的合并基础:

开始的情况

    A - B     <--- target
   /
  M 
   \
    C - D     <--- source
Run Code Online (Sandbox Code Playgroud)

我想樱桃挑选D到B.

  1. 创建新的分支补丁后,将D重新映射到M上

      A - B     <--- target
     /
    M - D'      <--- patch
     \
      C - D     <--- source
    
    Run Code Online (Sandbox Code Playgroud)
  2. 合并C和D'以获取源代码

    合并B和D'以获取目标的修补版本

       A - B …
    Run Code Online (Sandbox Code Playgroud)

git renaming git-rebase cherry-pick git-cherry-pick

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

如何表达参数需要在C#中实现多个接口?

与此问题类似:我如何需要一个方法参数来实现多个接口? 我想要一个方法参数来实现几个接口.

接口应以任意方式组合,我不想为每个有效组合创建接口.

想一个文件.有可能:

  1. readable => IReadable
  2. 可写=> IWriteable
  3. 存档=> IArchive
  4. 自动生成=> IGenerated

...

如果我想表达一个参数需要是一个可写的,生成的存档我不想生成,IWritableGeneratedArchive因为有太多的组合,我想用它与一些我无法修改的现有类.

伪代码:

void WriteTo( IWritable + IGenerated + IArchive file)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

c# interface-design interface

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

在WPF中限制"自动"和"1*"的行高

我有一个WPF应用程序,其布局由顶层的3行组成Grid.

我希望中间行占用它所需的空间(它需要的最大空间是有限的,但取决于窗口的宽度).底行应占用剩余空间.棘手的部分是顶行.它的大小可以根据按钮切换大部分内容的可见性而变化.我希望它最多使用50%的高度但不超过它真正需要的高度.以下XAML描述了我想要完成的任务:

    <Grid.RowDefinitions>
        <!-- neither "1*" nor "Auto" fully meets my needs -->
        <RowDefinition Height="Min(1*,Auto)"></RowDefinition>

        <RowDefinition Height="Auto"></RowDefinition>

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

行是:

  1. WrapPanel
  2. WrapPanel
  3. TextBox

如果这很重要

c# wpf grid-layout

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

监控任务完成

我运行几个任务并将它们保存在列表中以检查它们是否已经完成.

我发现来自async方法RanToCompletion的任务总是显示为任务本身仍在运行.

Task在两种情况下,有没有办法从对象获取"完整"信息?

这是一个显示此行为的简单测试用例.我运行两个任务,有/没有async方法,并在完成期间和完成后检查状态.

private void test()
{

    ;
    Action actionAsync = funcAsync;
    Task taskAsync = Task.Run(actionAsync);
    Action action = func;
    Task task = Task.Run(action);

    var statusAsync = taskAsync.Status;
    var status = task.Status;

    // stati are either WaitingToRun or Running

    Thread.Sleep(TimeSpan.FromSeconds(2));

    // Now it's quite certain, that both have started

    var statusAsync2 = taskAsync.Status;
    var status2 = task.Status;

    Debug.Assert(statusAsync2 == TaskStatus.RanToCompletion);
    Debug.Assert(status2 == TaskStatus.Running);

    ;

    Thread.Sleep(TimeSpan.FromSeconds(12));

    // Now it's quite certain, that both …
Run Code Online (Sandbox Code Playgroud)

c# task

-2
推荐指数
1
解决办法
1104
查看次数