我的目标是编写一个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级别的代码来处理它,但这似乎有点过分.
这是我的原始代码:
<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"
进度条修改每个解决方案,但没有变化.在渲染文本块后,如何拉伸它以填充所有空间?
我有一个很长的字符串,我想把它放在一个小字段中.为了实现这一点,我将字符串分解为空格上的行.算法如下:
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"不会破坏,但我想要它.我有一个想法是期待看到下一个空白发生的地方,但我不确定这是否会导致最少的线路成为可能.
我有一个简单的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和默认锚点.我究竟做错了什么?
我有这样的方法:
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()
它做得好一点,但我不习惯使用这样的计算来定义常量.
我有一个整数列表.我想在该列表中找到所有连续数字的运行,由起始索引和长度定义.因此,例如,对于输入列表[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.任何想法如何做到这一点?
这是GIMP的截图:
左侧有一个常规窗口标题,右侧有一个更小,更紧凑的窗口类型.这是我不时在节目中看到的东西.如何在C#中创建这样的窗口?
我有两个图形对象(比如某种Table
s),我想设置它们的样式.琐碎的代码如下:
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#方法来从List<T>
使用自定义比较操作中删除重复项.在.NET 4.是否有一个或我必须自己编写?
我有一个这样的课:
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)