天道酬勤,学无止境

即使将焦点放在另一个控件上,如何更改listview所选行的背景色?(How to change listview selected row backcolor even when focus on another control?)

问题

我有一个使用条形码扫描仪作为输入设备的程序,这意味着我需要将重点放在文本框上。

该程序具有一个listview控件,当扫描特定条形码时,我将以编程方式选择其中一项。 我通过以下方式设置行的背景色:

listviewitem.BackColor = Color.LightSteelBlue;

我尝试过的事情:

  • listview.HideSelection设置为false
  • 设置颜色后调用listview.Focus()
  • listviewitem.Focused设置为true
  • 呼叫listview.Invalidate
  • 呼叫listview.Update()
  • 调用listview.Refresh()
  • 上面的不同组合

我还在计时器中进行了上述组合,因此它们在不同的线程上被调用,但仍然没有成功。

有任何想法吗?

更多信息:

  • 这里的关键是控制焦点。 选择其中一项时, listview控件没有焦点
  • 我通过执行以下操作选择一项:

     listView1.Items[index].Selected = true;
  • 焦点始终在文本框中。

  • 该计算机没有键盘或鼠标,只有条形码读取器。

我有以下代码可以将重点放在文本框上:

private void txtBarcode_Leave(object sender, EventArgs e)
{
   this.txtBarcode.Focus();
}

您需要在文本框中添加该代码以模拟我的问题。

回答1

假设您已将ListView控件的HideSelection属性设置为False,则您描述的内容将完全按预期工作。 这是用于演示目的的屏幕截图。 我创建了一个空白项目,向窗体添加了ListView控件和TextBox控件,向ListView添加了一些示例项,将其视图设置为“ Details”(尽管在任何视图中都可以使用),并将HideSelection为false。 正如您在问题中所显示的,我处理了TextBox.Leave事件,并添加了一些简单的逻辑以在将其名称输入TextBox时选择相应的ListViewItem请注意,在ListView选择了“测试项目六”:

测试项目的屏幕快照—注意,即使ListView控件没有焦点,“测试项目六”也会突出显示。

现在,正如我最初怀疑的那样,如果您自己动手设置BackColor属性您将会搞砸。 我不确定您为什么要这么做,因为该控件已经默认使用默认选择颜色来表示选中的项目。 如果要使用不同的颜色,则应更改Windows主题,而不要尝试编写代码来实现。

实际上,如果我除了添加现有代码以选择与在TextBox键入的名称相对应的ListViewItem item.BackColor = Color.LightSteelBlue ,还添加以下行项目: item.BackColor = Color.LightSteelBlue ,我将得到与上图所示完全相同的内容。 在将焦点设置到控件之前,项目的背景颜色不会更改。 这是预期的行为,因为选定项目在具有焦点时看起来与在其父控件不集中时看起来不同。 焦点控件上的选定项目涂有系统突出显示颜色; 未聚焦控件上的选定项目将使用系统3D颜色绘制。 否则,将无法判断ListView控件是否具有焦点。 此外,当ListView控件具有焦点时,操作系统将完全忽略任何自定义BackColor属性。 背景将以默认的系统突出显示颜色进行绘制。

当然,将焦点显式设置为ListView控件会导致将自定义背景色应用于ListViewItem ,并且呈现的颜色与我在计算机上选择的配色方案形成鲜明对比的颜色(请记住,不是每个人都使用默认值)。 但是,问题立即变得很明显:由于在TextBox.Leave事件处理程序方法中编写了代码,因此无法将焦点设置到ListView控件!

我现在可以告诉您,将焦点设置在焦点更改事件中是错误的选择。 在Windows中,这是一条硬规则,不允许您执行此类操作,并且文档甚至明确警告您不要这样做。 大概,您的答案将与“我必须”类似,但这不是借口。 如果一切都按预期进行,那么您将不会首先问这个问题。

所以现在怎么办? 您的应用程序的设计已损坏。 我建议修复它。 不要尝试自己设置BackColor属性来表明已选择一个项目。 它与Windows突出显示所选项目的默认方式相冲突。 另外,请勿尝试在焦点更改事件中设置焦点。 Windows明确禁止这样做,并且文档很清楚,您不应该这样做。 如果目标计算机没有鼠标或键盘,则不清楚用户将如何首先将焦点设置到其他任何位置,除非您编写了这样做的代码,否则您不应该这样做。

但令人惊讶的是,我几乎没有信心要修复您的应用程序。 忽略文档中警告的人往往是不听问答网站上善意建议的人。 因此,我会向您扔骨头,并告诉您如何获得所需的效果。 关键在于不设置ListViewItemSelected属性,这样可以避免自定义BackColor与系统默认突出显示颜色之间的冲突。 这也使您不必将焦点显式设置为ListView控件,然后再返回(如上所述,鉴于您的Leave事件处理程序方法,实际上并没有发生这种情况)。 这样做会产生以下结果:

固定示例—注意“所选”项目的难看的蓝色与我当前的主题设置形成对比。

这是代码,虽然不是很漂亮,但这只是概念的证明,而不是最佳实践的样本:

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();
      listView1.View = View.Details;
      listView1.HideSelection = false;
   }

   private void textBox1_TextChanged(object sender, EventArgs e)
   {
      foreach (ListViewItem item in listView1.Items)
      {
         if (item.Text == textBox1.Text)
         {
            item.BackColor = Color.LightSteelBlue;
            return;
         }
      }
   }

   private void textBox1_Leave(object sender, EventArgs e)
   {
      this.textBox1.Focus();
   }
}
回答2

标准ListView不允许您设置所选行的背景色。 所选行的背景(和前景)颜色始终由操作系统的主题控制。

您必须拥有绘制ListView所有者才能解决此问题,或者可以使用ObjectListView。 ObjectListView是一个围绕.NET WinForms ListView的开源包装程序,它使它使用起来更加容易,并且可以轻松地允许在普通ListView中很难处理的事情(例如更改选定行的颜色)。

this.objectListView1.UseCustomSelectionColors = true;
this.objectListView1.HighlightBackgroundColor = Color.Lime;
this.objectListView1.UnfocusedHighlightBackgroundColor = Color.Lime;

没有焦点时,将显示ObjectListView。

在此处输入图片说明

回答3

这是不允许多个选择并且没有图像(例如复选框)的ListView的解决方案。

  1. 设置ListView的事件处理程序(在本示例中,该事件处理程序的名称为listView1 ):
    • DrawItem
    • 离开(当失去ListView的焦点时调用)
  2. 声明一个全局int变量(即,包含ListView的Form的成员,在此示例中,其名为gListView1LostFocusItem )并为其分配值-1
    • int gListView1LostFocusItem = -1;
  3. 实施事件处理程序,如下所示:

     private void listView1_Leave(object sender, EventArgs e) { // Set the global int variable (gListView1LostFocusItem) to // the index of the selected item that just lost focus gListView1LostFocusItem = listView1.FocusedItem.Index; } private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { // If this item is the selected item if (e.Item.Selected) { // If the selected item just lost the focus if (gListView1LostFocusItem == e.Item.Index) { // Set the colors to whatever you want (I would suggest // something less intense than the colors used for the // selected item when it has focus) e.Item.ForeColor = Color.Black; e.Item.BackColor = Color.LightBlue; // Indicate that this action does not need to be performed // again (until the next time the selected item loses focus) gListView1LostFocusItem = -1; } else if (listView1.Focused) // If the selected item has focus { // Set the colors to the normal colors for a selected item e.Item.ForeColor = SystemColors.HighlightText; e.Item.BackColor = SystemColors.Highlight; } } else { // Set the normal colors for items that are not selected e.Item.ForeColor = listView1.ForeColor; e.Item.BackColor = listView1.BackColor; } e.DrawBackground(); e.DrawText(); }

注意:此解决方案将导致一些闪烁。 解决此问题的方法涉及子类化ListView控件,以便可以将受保护的属性DoubleBuffered更改为true。

public class ListViewEx : ListView
{
    public ListViewEx() : base()
    {
        this.DoubleBuffered = true;
    }
}
回答4

SelectedIndexChanged

    private void lBxDostepneOpcje_SelectedIndexChanged(object sender, EventArgs e)
    {

        ListViewItem item = lBxDostepneOpcje.FocusedItem as ListViewItem;
        ListView.SelectedIndexCollection lista = lBxDostepneOpcje.SelectedIndices;
        foreach (Int32 i in lista)
        {
            lBxDostepneOpcje.Items[i].BackColor = Color.White;
        }
        if (item != null)
        {
            item.Selected = false;
            if (item.Index == 0)
            {
            }
            else
            {
                lBxDostepneOpcje.Items[item.Index-1].BackColor = Color.White;
            }
            if (lBxDostepneOpcje.Items[item.Index].Focused == true)
            {
                lBxDostepneOpcje.Items[item.Index].BackColor = Color.LightGreen;
                if (item.Index < lBxDostepneOpcje.Items.Count-1)
                {
                    lBxDostepneOpcje.Items[item.Index + 1].BackColor = Color.White;
                }
            }
            else if (lBxDostepneOpcje.Items[item.Index].Focused == false)
            {
                lBxDostepneOpcje.Items[item.Index].BackColor = Color.Blue;
            }
        }

    }
回答5

在这种情况下,您不能将焦点设置在listview控件上。 txtBarcode_Leave方法将阻止这种情况。 但是,如果您希望能够通过单击选择列表视图项,则只需将以下代码添加到列表视图的MouseClick事件处理程序中即可:

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        ListView list = sender as ListView;

        for (int i = 0; i < list.Items.Count; i++)
        {
            if (list.Items[i].Bounds.Contains(e.Location) == true)
            {
                list.Items[i].BackColor = Color.Blue; // highlighted item
            }
            else
            {
                list.Items[i].BackColor = SystemColors.Window; // normal item
            }
        }
    }
回答6

就是这样:

  1. 设置属性UnfocusedHighlighForegroundColor =“蓝色”
  2. 设置属性UnfocusedHighlighBackgroundColor =“白色”
  3. 设置属性UserCustomSelectionColors = true

祝你好运 :)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 单击时创建具有可选行的ListView /更改ListView行的背景色(Create a ListView with selectable rows/change background color of ListView rows when clicked)
    问题 问题 我正在尝试创建具有可选项目的ListView 。 我希望能够在ListView单击一个项目,并使该项目在列表中更改颜色,然后继续对行中的数据进行其他处理。 我正在使用SimpleAdapter 。 如何做到这一点,以使当我点击一行时,它变成不同的颜色,然后当我点击另一行时,新的行被选中并更改为新的颜色,而旧的行又变回普通颜色。 ? 代码 到目前为止,这是我的代码。 DBTools类具有所有要在ListView显示并整理并处理的数据。 getAllReceivers()方法返回HashMap<String, String>的ArrayList ,其中包含我的所有数据。 MainActivity.java: public class MainActivity extends ListActivity { DBTools dbTools = new DBTools(this); ArrayList<HashMap<String, String>> receiverList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().hide(); setContentView(R.layout
  • 如何在DataGrid中设置所选行的颜色(How can I set the color of a selected row in DataGrid)
    问题 DataGrid中选定行的默认背景色太暗,以至于我无法读取它。 无论如何有覆盖它吗? 试过这个 <dg:DataGrid.RowStyle> <Style TargetType="{x:Type dg:DataGridRow}"> <Style.Triggers> <Trigger Property="IsSelected" Value="True" > <Setter Property="Background" Value="Gainsboro" /> </Trigger> </Style.Triggers> </Style> </dg:DataGrid.RowStyle> 但还是没事... 回答1 在我的情况下,上述解决方案在每个单元格周围都留下了蓝色边框。 这是对我有用的解决方案。 非常简单,只需将其添加到您的DataGrid 。 您可以将其从SolidColorBrush更改为任何其他画笔,例如线性渐变。 <DataGrid.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF0000"/> </DataGrid.Resources> 回答2 知道了。 在DataGrid.Resources部分中添加以下内容: <DataGrid
  • C#在更新时闪烁ListView(c# flickering Listview on update)
    问题 我有一个列表视图,该视图会定期更新(每60秒一次)。 每次过时我都会忽悠我,这使我很烦。 使用的方法是清除所有项目,然后重新创建它们。 我决定不清除要使用新文本直接写到单元格中的项目。 这是更好的方法还是任何人都有更好的解决方案。 回答1 ListView控件存在闪烁问题。 问题似乎是控件的Update重载未正确实现,因此其行为类似于Refresh。 更新应导致控件仅重绘其无效区域,而刷新应重绘控件的整个客户区。 因此,例如,如果要更改列表中一项的背景颜色,则仅需要对该特定项进行重新粉刷。 不幸的是,ListView控件似乎有不同的看法,并且每当您与单个项目打交道时都希望重绘其整个表面……即使该项目当前未显示。 因此,无论如何,您可以按照以下步骤滚动自己的图像来轻松抑制闪烁: class ListViewNF : System.Windows.Forms.ListView { public ListViewNF() { //Activate double buffering this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); //Enable the OnNotifyMessage event so we get a chance to
  • 使用CAB在自定义ListView中进行多项选择(Multiple selection in custom ListView with CAB)
    问题 在阅读并尝试了好几天的错误之后,我正在放弃并寻求帮助。 <编辑>我正在使用ActionBarSherlock。 </编辑> 我要实现的目标:一个ListView,每行具有自定义布局,用户可以在其中选择多个列表项。 所选列表项应具有不同的背景色。 如果选择了至少一项,则应显示上下文操作栏(CAB)。 它看起来或多或少类似于GMail应用程序中对电子邮件的多种选择。 唯一的区别是,在gmail应用程序中,选择是通过单击一行的复选框来完成的,而我不想有一个复选框,但是无论用户单击何处,都应选择一行。 我尝试的方法:在本教程中,使用Checkable行布局和一些逻辑来更改切换检查状态时的背景色,除了无法在ListView上注册类似于OnItemClickListener的单击侦听器以显示CAB之外,其他所有工作。 为每行视图提供单击侦听器都没有帮助,因为这阻止了更改所选项目的背景颜色。 我也尝试像这样将MultiChoiceModeListener添加到ListView listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { //.. }); 结果相同,背景颜色不变。 我在寻找什么
  • 突出显示ListView选定的行(Highlight ListView selected row)
    问题 我有一张专辑清单(几百张)。 当我触摸选定的专辑时,我想为用户提供播放整个专辑或移动到其曲目ListView的选择。 没问题。 但是,在触摸albumListView中的空白之后,我希望该行保持突出显示,以便用户知道他们单击了哪个项目,然后可以移至“确定”或“播放”。 如何在ListView中突出显示一行? 回答1 引用自http://android-developers.blogspot.de/2008/12/touch-mode.html 想象一个简单的应用程序,例如ApiDemos,它显示了一个文本项列表。 用户可以使用轨迹球自由浏览列表,也可以使用触摸屏滚动和弹出列表。 这种情况下的问题是,当用户通过触摸屏操作列表时,如何正确处理选择。 在这种情况下,如果用户在列表顶部选择一个项目,然后将列表向底部倾斜,那么选择该怎么办? 它应该保留在项目上并滚动到屏幕之外吗? 如果用户随后决定使用轨迹球移动选择内容,应该怎么办? 或更糟糕的是,如果用户按下轨迹球以对当前选定的项目进行操作,该项目将不再显示在屏幕上,该怎么办? 经过仔细考虑,我们决定在用户​​通过触摸屏操纵UI时完全删除选择。 在触摸模式下,没有焦点,也没有选择。 用户进入触摸模式后,网格列表中的任何选定项目都会被取消选择。 同样,当用户进入触摸模式时,所有聚焦的窗口小部件都将变为非聚焦状态。
  • ListView内的可聚焦EditText(Focusable EditText inside ListView)
    问题 到目前为止,我已经在此上花费了大约6个小时,除了遇到障碍之外,什么都没有打到。 通常的前提是, ListView有一行(无论是由适配器生成还是作为标题视图添加),其中包含EditText小部件和Button 。 我想要做的就是能够使用慢进/箭头,将选择器导航到正常的单个项目,但是当我到达特定的行时-即使我必须明确标识该行-具有可聚焦的一个孩子,我希望那个孩子能集中注意力,而不是用选择器指示位置。 我尝试了很多可能性,到目前为止还没有运气。 布局: <ListView android:id="@android:id/list" android:layout_height="fill_parent" android:layout_width="fill_parent" /> 标头视图: EditText view = new EditText(this); listView.addHeaderView(view, null, true); 假设适配器中还有其他项目,使用箭头键将按预期在列表中向上/向下移动选择; 但是当到达标题行时,它也会与选择器一起显示,并且无法使用摇动键将焦点集中在EditText 。 注意:点击EditText会将其聚焦在该点上,但是这取决于触摸屏,这不是必须的。 在这方面, ListView显然具有两种模式: 1. setItemsCanFocus
  • QTTabBar 「资源管理器」让你的文件夹拥有浏览器标签页般的体验
    前言 对于广大使用 Windows 系统的同学们来说,「资源管理器」一定是大家再熟悉不过的一位老伙计了,说起名字可能还会有不知道的同学,但我要是说起「文件夹」,大家的脑海里应该立刻就能浮现出熟悉的画面:一个四四方方的小盒子里,放着我们所有的文件:音乐、视频、软件……,几乎任何一个和文件打交道的操作,都一定少不了它。 但就是这样一个重要的角色,却一直令效率人士诟病不已,因为从 XP 时代到如今的 Win10,微软在资源管理器上始终没有给我们带来令人满意的升级。界面不咸不淡的地改变着风格,功能却仍旧只是简单的分类、排序、重命名和查看属性;为了找一个文件,不得不点进一层又一层嵌套着的子文件夹,如果没有找到,那么就又得先返回,再点进新的文件夹里接着找;如果你要拖拽复制,就需要重新打开一个新的文件夹;如果你打开的文件夹过多,一会儿后,你就只能在满桌面的文件夹中不知所措;如果你不小心关掉了一个正在用的文件夹,还得重新从磁盘的层级开始一级级打开文件夹寻找。 提升 Windows 系统的文件操作体验几乎是每一个效率人士的心声,如何才能在 Windows 系统里获得高效的文件操作体验,在少数派的文章里可以找到非常多的答案,总体上来说大致分为两类。 增强现有的「资源管理器」 Clover (不推荐) Clover 是我接触的第一款此类软件,当年高中时第一次得知有一款软件可以给平常使用的文件夹加上如同
  • RecyclerView与ListView(RecyclerView vs. ListView)
    问题 来自android开发人员(创建列表和卡片): RecyclerView小部件是ListView的更高级,更灵活的版本。 好的,听起来很酷,但是当我看到此示例图片时,我对两者之间的区别感到非常困惑。 上面的图片可以使用自定义适配器通过ListView轻松创建。 那么,在什么情况下应该使用RecyclerView呢? 回答1 RecyclerView是作为ListView改进而创建的,因此,可以的,您可以使用ListView控件创建附加列表,但是使用RecyclerView更容易,因为它: 在上/下滚动时重用单元格-这可以通过在ListView适配器中实现View Holder来实现,但这是可选的,而在RecycleView则是编写适配器的默认方式。 将列表与其容器解耦-因此,您可以在运行时通过设置LayoutManager轻松地将列表项放在不同的容器(linearLayout,gridLayout)中。 例子: mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //or mRecyclerView.setLayoutManager(new
  • 将WPF Listview滚动到特定行(Scroll WPF Listview to specific line)
    问题 WPF,类似Browser的应用。 我得到了一个包含ListView的页面。 调用PageFunction之后,我向ListView添加了一行,并希望将新行滚动到视图中: ListViewItem item = ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem; if (item != null) ScrollIntoView(item); 这行得通。 只要能看到新行,该行就会获得应有的关注。 问题是,当该行不可见时,事情就不起作用了。 如果该行不可见,则不会为该行生成ListViewItem,因此ItemContainerGenerator.ContainerFromIndex返回null。 但是,如果没有该项,如何将线滚动到视图中? 有什么方法可以滚动到最后一行(或任何地方)而不需要ListViewItem? 回答1 我认为这里的问题是,如果该行不可见,则尚未创建ListViewItem。 WPF创建按需显示。 因此,在这种情况下,您可能会获得该商品的null ,对吗? (根据您的评论,您可以) 我在MSDN论坛上找到了一个链接,该链接建议直接访问Scrollviewer以进行滚动。 在我看来,这里提供的解决方案非常像黑客,但是您可以自己决定。 这是上面链接中的代码片段:
  • ComboBox SelectedItem与SelectedValue(ComboBox SelectedItem vs SelectedValue)
    问题 以下代码按预期工作,当用户在下拉列表中选择新项目时,模型上的MyProperty就会更新。 comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged); 但是,以下操作无法以相同的方式工作,并且只有在输入焦点移至表单上的另一个控件后,才会触发模型更新: comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged); 有人知道为什么吗? 我什至不知道从哪里开始调查原因。 朝着正确方向开始调查或直接进行解释的指针将同样受到赞赏。 撇开:出于我的目的,我最终绑定到SelectedItem和SelectedValue 。 这样,我就可以基于UI更改(通过SelectedValue绑定)获得即时模型更新,并且可以基于程序化模型更改(通过SelectedItem绑定)获得UI更新。 回答1 ComboBox控件继承自ListControl控件。 SelectedItem属性是ComboBox控件的适当成员。 更改时触发的事件是ComboBox
  • 更改ListView上所选项目的背景颜色(Change background color of selected item on a ListView)
    问题 我想知道如何更改listView上所选项目的背景颜色。 我只想更改用户单击的特定项目,这意味着如果用户单击另一个项目,它将被突出显示。 好吧,因为我希望它尽可能保持简单并使用默认的android listview,所以我改用以下代码: record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try{ for (int ctr=0;ctr<=record_items.length;ctr++){ if(i==ctr){ record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN); }else{ record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE); } } } catch (Exception e){ e.printStackTrace(); } Log.v("Selected item",record_list.getItemAtPosition(i)); } }); 好的,这是可行的
  • 更改所选ListBox项的背景颜色(Change background color for selected ListBox item)
    问题 到目前为止,这是我的XAML。 <ScrollViewer Grid.Column="1" Grid.RowSpan="2"> <ListBox Background="Black" ItemsSource="{Binding Path=ActiveLog}" > <ListBox.ItemTemplate> <DataTemplate> <Grid Background="Black"> <Grid.ColumnDefinitions> <ColumnDefinition Width="200"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White"> <TextBlock >Date:</TextBlock> <TextBlock Text="{Binding Path=LogDate}"/> <
  • 如何在C#中的按钮上设置/更改/删除焦点样式?(How to set/change/remove focus style on a Button in C#?)
    问题 我有几个按钮,我修改了它们的外观。 我将它们设置为带有背景和自定义边框的平面按钮,因此它们看起来都非常漂亮,不再像普通按钮一样(实际上,它们现在看起来像Office 2003按钮;-)。 这些按钮的边框为一个像素。 但是,当按钮被选中时(通过单击或通过按下Tab键的键盘操作获得焦点),该按钮会突然获得一个额外的边框,并带有相同颜色的边框,因此使其成为两个像素的边框。 此外,当我禁用一个像素边框时,按钮不会获​​得一个像素边框的焦点。 在网上,这个问题被问得很像“如何禁用按钮上的焦点”,但这不是我想要的:焦点应该仍然存在,只是不能以现在的方式显示。 有什么建议? :-) 回答1 这是您想要的效果吗? public class NoFocusCueButton : Button { protected override bool ShowFocusCues { get { return false; } } } 您可以像使用常规按钮一样使用此自定义按钮类,但是不会为您提供额外的矩形焦点。 回答2 我对恼人的双边框有同样的问题,偶然发现了这个线程,寻找答案... 我解决此问题的方法是将BorderSize设置为0,然后在OnPaint中绘制自己的边框 *注意:不是整个按钮,只有边框 一个简单的例子是: public class CustomButton : Button {
  • jqgrid:如何根据所选行中的列值设置工具栏选项(jqgrid: how to set toolbar options based on column value in row selected)
    问题 我有一个具有值(可编辑,只读)的列字段类型。 所有行将填充这些值之一。 我只想在选定行的列值可编辑的情况下启用/禁用工具栏选项编辑。 我如何在jqgrid中实现这一目标。 回答1 如果我理解正确,则您要基于所选行启用/禁用导航器的“编辑”或“删除”按钮。 这样你就会有 如果未选择任何行,或者所选行是不可编辑的,或者是标准导航器工具栏 如果该行是可编辑的。 无论是“可编辑”还是“只读”列的条件似乎对我来说都是错误的,因为它是列上的条件列,而不是行上的条件列,但是您可以轻松实现自己的自定义条件。 实现可能是 var myGrid = jQuery("#list"); myGrid.jqGrid({ /* definition of jqGrid */ beforeSelectRow: function(rowid) { var selRowId = $(this).getGridParam('selrow'), tr = $("#"+rowid); // you can use getCell or getRowData to examine the contain of // the selected row to decide whether the row is editable or not if (selRowId !== rowid && !tr.hasClass(
  • Android ListView所选项目保持突出显示(Android ListView selected item stay highlighted)
    问题 我有一个带有两个ListView的XML ,一个带有一个由选择查询( lv_cli )填充的客户端列表,另一个带有选择的客户端的详细信息( lv_cli_det )的lv_cli_det 。 我想在lv_cli选择客户端,而lv_cli_det显示详细信息。 XML: <ListView android:id="@+id/cli_lista" android:layout_width="512dp" android:layout_height="wrap_content" android:fadeScrollbars="false" > </ListView> <ListView android:id="@+id/cli_lista_det" android:layout_width="512dp" android:layout_height="wrap_content" android:layout_toRightOf="@+id/cli_lista" android:fadeScrollbars="false" > </ListView> Java的: Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null); final ListView t = (ListView
  • 如何使用Postgres中的CSV文件中的值更新所选行?(How to update selected rows with values from a CSV file in Postgres?)
    问题 我正在使用Postgres,并想进行一个大型更新查询,该查询将从CSV文件中获取,可以说我有一个已得到的表(id, banana, apple) 。 我想运行一个更新来更改香蕉而不是苹果,每个新的香蕉及其ID都将保存在CSV文件中。 我尝试查看Postgres网站,但这些示例让我丧命。 回答1 将文件复制到临时登台表,然后从那里更新实际表。 喜欢: CREATE TEMP TABLE tmp_x (id int, apple text, banana text); -- but see below COPY tmp_x FROM '/absolute/path/to/file' (FORMAT csv); UPDATE tbl SET banana = tmp_x.banana FROM tmp_x WHERE tbl.id = tmp_x.id; DROP TABLE tmp_x; -- else it is dropped at end of session automatically 如果导入的表与要更新的表完全匹配,这可能很方便: CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0; 无约束地创建一个与现有表结构匹配的空临时表。 礼遇 SQL COPY为此需要超级用户特权。 (手册):
  • Git责备-先前的提交?(Git blame — prior commits?)
    问题 是否有可能看到谁在git blame报告的提交之前编辑了特定行,例如给定行的提交历史? 例如,我运行以下命令(在uncrustify项目上): $ git blame -L10,+1 src/options.cpp ^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h" 如何确认提交fe25b6d之前谁编辑了该行? 又是谁犯下之前编辑呢? 回答1 git blame -L 10,+1 fe25b6d^ -- src/options.cpp 您可以为git blame指定一个修订版本,以便从(而不是HEAD的默认值)开始回溯; fe25b6d^是的父fe25b6d 。 编辑:Git 2.23的新增功能,我们在git blame添加了--ignore-rev选项: git blame --ignore-rev fe25b6d 虽然这不能回答OP给出的堆栈提交问题(按照其他答案,您将使用git log ),但这是此解决方案的一种更好的方法,因为您可能不会误解其他行。 回答2 您可以使用git log -L查看一系列行的演变。 例如 : git log -L 15,23:filename.txt 表示“跟踪名为filename.txt的文件中第15至23行的演变”。 回答3
  • WPF TreeView:如何在资源管理器中设置带有圆角的选定项目的样式(WPF TreeView: How to style selected items with rounded corners like in Explorer)
    问题 WPF TreeView中的选定项目具有带有“尖锐”角的深蓝色背景。 今天看来有点过时了: 我想将背景更改为Windows 7资源管理器中的外观(有/无焦点): 到目前为止,我尝试过的操作不会删除原始的深蓝色背景,而是在其顶部绘制一个圆形边框,以便您在边缘和左侧看到深蓝色-难看。 有趣的是,当我的版本没有重点关注时,它看起来还可以: 我想避免重新定义控件模板,如此处或此处所示。 我想设置所需的最少属性,以使所选项目在资源管理器中看起来像。 备选方案:我也很高兴让集中的选定项目看起来像我现在没有焦点时的样子。 失去焦点时,颜色应从蓝色变为灰色。 这是我的代码: <TreeView x:Name="TreeView" ItemsSource="{Binding TopLevelNodes}" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
  • Xamarin.Forms ListView:设置点击项目的突出显示颜色(Xamarin.Forms ListView: Set the highlight color of a tapped item)
    问题 使用Xamarin.Forms ,如何定义选定/点击的ListView项目的突出显示/背景颜色? (我的列表具有黑色背景和白色文本颜色,因此iOS上的默认突出显示颜色太亮。相比之下,Android上根本没有突出显示-直到细微的水平灰线为止。) 示例:(左:iOS,右:Android;同时按下“ Barn2”) 回答1 在Android中,只需在Resources \ values下编辑您的styles.xml文件,然后添加以下代码: <resources> <style name="MyTheme" parent="android:style/Theme.Material.Light.DarkActionBar"> <item name="android:colorPressedHighlight">@color/ListViewSelected</item> <item name="android:colorLongPressedHighlight">@color/ListViewHighlighted</item> <item name="android:colorFocusedHighlight">@color/ListViewSelected</item> <item name="android:colorActivatedHighlight">@color
  • 在vi中快速缩进多行(Indent multiple lines quickly in vi)
    问题 它应该是微不足道的,甚至可能在帮助中,但是我不知道如何导航。 如何在vi中快速缩进多行? 回答1 使用>命令。 到缩进五线,5>>。 要标记一行并缩进,可使用V j j >缩进三行(仅Vim)。 要缩进大括号块,请将光标放在大括号之一上,然后使用> %或在block use > i B中的任何位置。 如果要在周围复制文本块,并且需要在新位置对齐块的缩进,请使用] p而不是p 。 这会将粘贴的块与周围的文本对齐。 另外,shiftwidth设置使您可以控制缩进多少空格。 回答2 该答案总结了该问题的其他答案和评论,并基于Vim文档和Vim Wiki添加了更多信息。 为简洁起见,此答案不能区分Vi和Vim特定的命令。 在下面的命令中,“重新缩进”表示“根据缩进设置缩进行”。 shiftwidth是控制缩进的主要变量。 通用命令 >> Indent line by shiftwidth spaces << De-indent line by shiftwidth spaces 5>> Indent 5 lines 5== Re-indent 5 lines >% Increase indent of a braced or bracketed block (place cursor on brace first) =% Reindent a braced or bracketed