Как я могу дать элементу WPF прямоугольную плоскую 3D границу?

В MySQL InnoDB SELECT COUNT(*) WHERE secondary_index = ? - это дорогостоящая операция, и когда у пользователя много сообщений, этот запрос может занять много времени. Даже при использовании индекса движок все равно должен считать все соответствующие записи. Производительность будет ухудшаться с ростом общего количества сообщений.

С другой стороны, SELECT MAX(id) WHERE secondary_index = ? может очень эффективно доставить самый высокий идентификатор в этом индексе, выполнив так называемое сканирование свободного индекса . Производительность останется почти постоянной.

Если вы хотите понять, почему, рассмотрите поиск структуры данных B + Tree , которую InnoDB использует для организации своих данных.

Я предлагаю вам перейти к SELECT MAX(id), если требуется только проверить, есть ли новые сообщения (а не их количество).

Кроме того, если вы полагаетесь на количество сообщений, вы можете открыть пробел для условий гонки. Что если пользователь удалит сообщение и получит новое между двумя интервалами опроса?

7
задан Drew Noakes 24 February 2009 в 15:54
поделиться

2 ответа

Вот решение, которое я создал, который достигает большей части того, что я хочу. Это не дает полный контроль над всеми четырьмя сторонами независимо, но это действительно дает прямоугольное плоское 3D-изображение, которое я хочу.

Вот то, как это смотрит:

Вставьте это в Kaxaml для наблюдения его для себя:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Background="#CCC">
  <Page.Resources>
    <!-- A brush for flat 3D panel borders -->
    <LinearGradientBrush x:Key="Flat3DBorderBrush"
                         StartPoint="0.499,0" EndPoint="0.501,1">
      <GradientStop Color="#FFF" Offset="0" />
      <GradientStop Color="#DDD" Offset="0.01" />
      <GradientStop Color="#AAA" Offset="0.99" />
      <GradientStop Color="#888" Offset="1" />
    </LinearGradientBrush>
  </Page.Resources>
  <Grid>  
    <!-- A flat 3D panel -->
    <Border
          HorizontalAlignment="Center" VerticalAlignment="Center"
          BorderBrush="{StaticResource Flat3DBorderBrush}"
          BorderThickness="1" Background="#BBB">

          <!-- some content here -->
          <Control Width="100" Height="100"/>

    </Border>  
  </Grid>
</Page>

Надежда, которая выручает кого-то еще. Я все еще в поисках инновационных решений к этой проблеме, поэтому продолжайте отправлять, и я приму лучший ответ, чем этот.

14
ответ дан 6 December 2019 в 05:49
поделиться

Честно, вероятно, самый легкий путь состоял бы в том, чтобы использовать методы разделения на уровни. Например, создайте сетку как это:

  <Grid Width="50" Height="50">  
     <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
     </Grid.RowDefinitions>
     <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
     </Grid.ColumnDefinitions>

     <!-- Top Border -->
     <Border Height="3" Background="LightGray" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" />

     <!-- Right Border -->
     <Border Width="3" Background="DarkGray" Grid.Column="2" Grid.Row="0" Grid.RowSpan="3" />

     <!-- Content -->
     <Border Background="Gray" Grid.Row="1" Grid.Column="1" />

     <!-- Left Border -->
     <Border Width="3" Background="LightGray" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2" />

     <!-- Bottom Border -->
     <Border Height="3" Background="DarkGray" Grid.Row="2" Grid.Column="1" />

  </Grid>

Я думаю, что Вы получаете идею. Это - вероятно, самый легкий способ сделать его. Вы могли настроить это как шаблон и использовать его как это:

<Template x:Key="My3DBorder" TargetType="ContentControl">
    <!-- Put the Grid definition in here from above -->
</Template>

<ContentControl Template="{StaticResource My3dBorder}">
   <!-- My Content Goes Here -->
</ContentControl>
3
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: