小编Joh*_*ies的帖子

用于打开Windows资源管理器(或焦点,如果存在)并选择文件的代码

我的目标是编写一个C#代码,打开一个Windows资源管理器窗口,选择一个特定的文件.如果这样的窗户已经打开,我想把它带到前面.我尝试了两种选择.

首先,我首先明确地调用explorer.exe:

arg = "/select, " + pathToFile;
Process.Start("explorer.exe", arg);
Run Code Online (Sandbox Code Playgroud)

这会打开并选择一个正常的窗口,但问题是它将始终打开一个新窗口,即使存在一个窗口.所以我尝试了这个:

Process.Start(pathToDir);
Run Code Online (Sandbox Code Playgroud)

这可以打开一个新窗口或聚焦旧窗口,但不能选择文件.

我能做什么?我查看了explorer论据,但我没有看到任何可以使用的内容.我能想到的最后一个选项是获取已经打开的窗口列表并使用一些WINAPI级别的代码来处理它,但这似乎有点过分.

.net c# directory explorer windows-explorer

15
推荐指数
1
解决办法
4194
查看次数

为什么WPF进度条不适合?

这是我的原始代码:

<StackPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
        <ProgressBar Height="23" Name="searchProgressBar" Foreground="Blue" BorderBrush="#00000000" BorderThickness="1" VerticalAlignment="Top" HorizontalAlignment="Stretch"/>
        <TextBlock Text="asdf" Height="23"  Name="progressTextBlock" VerticalAlignment="Top" Foreground="Red" HorizontalAlignment="Right"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

进度条非常小,可能是2或3像素宽,然后是文本块和空白区域.所以我尝试将元素明确地对接到两侧:

<DockPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" >
            <ProgressBar DockPanel.Dock="Left" Height="23" Name="searchProgressBar" Foreground="Blue" BorderBrush="#00000000" BorderThickness="1" VerticalAlignment="Top" />
            <TextBlock DockPanel.Dock="Right" Text="asdf" Height="23"  Name="progressTextBlock" VerticalAlignment="Top" Foreground="Red" HorizontalAlignment="Right"/>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)

徒劳无功.我也尝试通过设置HorizontalAlignment="Stretch"进度条修改每个解决方案,但没有变化.在渲染文本块后,如何拉伸它以填充所有空间?

wpf alignment stackpanel

8
推荐指数
1
解决办法
7137
查看次数

将文本拆分为具有最大长度的行

我有一个很长的字符串,我想把它放在一个小字段中.为了实现这一点,我将字符串分解为空格上的行.算法如下:

    public static string BreakLine(string text, int maxCharsInLine)
    {
        int charsInLine = 0;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            builder.Append(c);
            charsInLine++;

            if (charsInLine >= maxCharsInLine && char.IsWhiteSpace(c))
            {
                builder.AppendLine();
                charsInLine = 0;
            }
        }
        return builder.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果有一个简短的单词,则会中断,然后是更长的单词.最大长度为16的"foo howcomputerwork"不会破坏,但我想要它.我有一个想法是期待看到下一个空白发生的地方,但我不确定这是否会导致最少的线路成为可能.

c# string algorithm text

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

调整窗口大小时自动调整TableLayoutPanel行的大小

我有一个简单的1x3 TableLayoutPanel.我想要实现一个非常简单的事情:当窗口调整大小时,调整中间行的大小并保持顶部和底部相同.我尝试做逻辑事情,即设置刚性的顶行和底行大小并自动调整中间行.不幸的是,这是调整大小的底线.

// 
// tableLayoutPanel1
// 
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.topPanel, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.middlePanel, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.bottomPanel, 0, 2);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 140F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(1102, 492);
this.tableLayoutPanel1.TabIndex = 19;
Run Code Online (Sandbox Code Playgroud)

所有内部面板都将Dock设置为Fill和默认锚点.我究竟做错了什么?

c# layout tablelayoutpanel winforms

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

一种在C#中编写大数字文字的方法

我有这样的方法:

Prefix GetPrefix(decimal value)
{
    if(value > 11000000000000000000)
        return Prefix.CosmicBig;
    if(value > 1000000000000000)
        return Prefix.ReallyBig;
    if(value > 3000000000000)
        return Prefix.Big;
    if(value > 50000000)
        return Prefix.Okay;
    if(value > 750000)
        return Prefix.MostlyNormal;
    if(value > 750000)
        return Prefix.SoSo;
    if(value > 750)
        return Prefix.Small;
    return Prefix.MiserablySmall;
}
Run Code Online (Sandbox Code Playgroud)

确切的值并不重要.重要的是它们有时会被更改(前缀用于绘图,而某些文本区域会在开发中更改大小).我正在寻找一种方法来编写这些文字,这种方式很容易被人类改变它,而不必计算所有的零.分隔符会很好.我想过写作11 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000,但那只是更难以管理.使用Math.Pow()它做得好一点,但我不习惯使用这样的计算来定义常量.

c# numbers decimal literals

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

LINQ找到一系列连续数字

我有一个整数列表.我想在该列表中找到所有连续数字的运行,由起始索引和长度定义.因此,例如,对于输入列表[1,2,3,5,7,8],输出将是[{1,3}, {5,1}, {7,2}].这很容易使用循环,类似这样(未经测试的伪代码):

for(i=1, i < maxNum; i++)
{
  number = list[i];
  previousNumber = list[i-1];
  if(number - previousNumber == 1)
  {
    runLength++;
  }
  else
  {
    result.Add(startingNumber, runLength);
    runLength = 1;
    startingNumber = number;
  }
}
Run Code Online (Sandbox Code Playgroud)

但我认为可以使用LINQ.任何想法如何做到这一点?

c# linq algorithm list

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

如何在WinForms中实现这种窗口风格?

这是GIMP的截图: 窗口标题

左侧有一个常规窗口标题,右侧有一个更小,更紧凑的窗口类型.这是我不时在节目中看到的东西.如何在C#中创建这样的窗口?

.net c# user-interface winforms

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

对同一类型的多个对象执行大量操作

我有两个图形对象(比如某种Tables),我想设置它们的样式.琐碎的代码如下:

table1.BorderWidth = 2;
table1.BorderColor = Color.GloriousPink;

table2.BorderWidth = 2;
table2.BorderColor = Color.GloriousPink;
Run Code Online (Sandbox Code Playgroud)

(真正的代码有更多行.)

更聪明的方法是使用方法.

void Format Table(int tableIndex)
{
    Table table;
    if(tableIndex == 1)
        table = table1;
    if(tableIndex == 2)
        table = table2;
    table.BorderWidth = 2;
    table.BorderColor = Color.GloriousPink;
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑一种方法,使其更具可扩展性(if/ switch部分增长迅速),我想出了:

foreach(Table table in new List<Table> { table1, table2 })
{
    table.BorderWidth = 2;
    table.BorderColor = Color.GloriousPink;
}
Run Code Online (Sandbox Code Playgroud)

这个更短,并且可以非常简单地添加任何可能的附加表.它有什么缺点吗?

c# iteration

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

C#方法从List <T>中删除重复项

我需要一个C#方法来从List<T>使用自定义比较操作中删除重复项.在.NET 4.是否有一个或我必须自己编写?

.net c# list

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

为什么派生类无法从基类访问受保护的getter?

我有一个这样的课:

public class Base
{
    public Base(string name)
    {
        this.Name = name;
    }

    public string Name { get; set; }
    public string PrettyName
    {
        get { return Prettify(Name); }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从中得出:

public class Derived : Base
{
    public Derived(Base b) : base(b.Name) { }
}
Run Code Online (Sandbox Code Playgroud)

Name不应该访问该属性; 逻辑名称只能由PrettyName.访问.所以我以为我会把这个属性做成这样的:

    public string Name { protected get; set; }
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个:

Cannot access protected member 'Name' via a qualifier of type 'Base'; the qualifier must be of type 'Derived' (or derived …
Run Code Online (Sandbox Code Playgroud)

c# getter setter encapsulation properties

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

C#中的应用程序关闭事件

我正在用NAudio写一个音乐播放器.在关闭播放器之前,我想调用一些停止播放的方法.我该怎么做呢?

.net c# events

0
推荐指数
1
解决办法
8769
查看次数