日期选择框兼容机房 Chrome 94:以前点下拉按钮靠 showPicker() 弹出日期框,它 Chrome 99 才正式有,Chrome 94 的原型上有这个方法、调用却没反应,项目 6 任务 3、项目 8 任务 5 选不了日期。改成把浏览器的日期框透明地盖在下拉按钮上、日历图标撑满按钮,点按钮由浏览器自己弹出(Chromium 94 和新版 Chrome 实测都能选)。运行时长日期和中文 Windows 一致,不带星期(Linux 的 zh-CN 长日期是"2026年10月28日星期三",日期框窄,星期被截掉)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9ed446f95a
commit
163e553de4
3 files changed
+43
-10
No files matched your search
@@ -28,10 +28,13 @@ internal static class StudentProgramHost
|
||||
Console.SetIn(TextReader.Null); // 标准输入用于协议,学生的 Console.ReadLine 读不到内容
|
||||
|
||||
// 和中文 Windows 一致:DateTime.ToString() 等按 zh-CN 格式输出。
|
||||
// Linux 上的区域数据把时间写成 09:05:03,中文 Windows 是 9:05:03(书上的截图也是),这里改成 Windows 的写法
|
||||
// Linux 上的区域数据把时间写成 09:05:03,中文 Windows 是 9:05:03(书上的截图也是);长日期后面多了星期(2024年1月16日星期二),
|
||||
// 中文 Windows 的长日期不带星期(日期选择框的长日期格式窄,带上星期会被截掉)。这里都改成 Windows 的写法
|
||||
var zhCN = (CultureInfo)CultureInfo.GetCultureInfo("zh-CN").Clone();
|
||||
zhCN.DateTimeFormat.LongTimePattern = "H:mm:ss";
|
||||
zhCN.DateTimeFormat.ShortTimePattern = "H:mm";
|
||||
zhCN.DateTimeFormat.LongDatePattern = "yyyy'年'M'月'd'日'";
|
||||
zhCN.DateTimeFormat.FullDateTimePattern = "yyyy'年'M'月'd'日' H:mm:ss";
|
||||
zhCN = CultureInfo.ReadOnly(zhCN);
|
||||
CultureInfo.DefaultThreadCurrentCulture = zhCN;
|
||||
CultureInfo.DefaultThreadCurrentUICulture = zhCN;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<script setup lang="ts">
|
||||
// 日期时间选择器:文字由运行器按 Format 生成(如 2024年1月16日),点下拉按钮弹出浏览器的日期 / 时间选择框,
|
||||
// 选好后把完整的日期时间发给运行器(只选日期时保留原来的时间,和 WinForms 一样)。
|
||||
import { computed, ref, type CSSProperties } from 'vue'
|
||||
// 下拉按钮上透明地盖着浏览器的日期框(日历图标撑满按钮),点按钮其实点的是日期框自己的图标,由浏览器弹出选择框。
|
||||
// 不用 showPicker():它 Chrome 99 才正式有,机房 Chrome 94 的原型上虽然有这个方法,调用却没有反应。
|
||||
import { computed, type CSSProperties } from 'vue'
|
||||
import type { ControlNode, UserAction } from '@iot/shared'
|
||||
|
||||
const props = defineProps<{
|
||||
@@ -20,12 +22,9 @@ const nativeValue = computed(() => {
|
||||
const [date, time] = value.value.split('T')
|
||||
return inputType.value === 'date' ? date : inputType.value === 'time' ? time : value.value
|
||||
})
|
||||
const picker = ref<HTMLInputElement>()
|
||||
|
||||
function open() {
|
||||
if (!props.enabled) return
|
||||
props.act({ action: 'dropDown' })
|
||||
picker.value?.showPicker?.()
|
||||
/** 点的是盖在按钮上的日期框:告诉运行器"展开了"(触发 DropDown),弹出由浏览器负责 */
|
||||
function nativeDown() {
|
||||
if (props.enabled) props.act({ action: 'dropDown' })
|
||||
}
|
||||
|
||||
function pick(event: Event) {
|
||||
@@ -58,7 +57,18 @@ function step(delta: number) {
|
||||
<span @mousedown.prevent="step(1)">▴</span>
|
||||
<span @mousedown.prevent="step(-1)">▾</span>
|
||||
</span>
|
||||
<span v-else class="wf-dtp-button" title="选择日期" @mousedown.prevent="open">▾</span>
|
||||
<input ref="picker" class="wf-dtp-native" :type="inputType" step="1" :value="nativeValue" tabindex="-1" @change="pick" />
|
||||
<span v-else class="wf-dtp-button">▾</span>
|
||||
<input
|
||||
class="wf-dtp-native"
|
||||
:class="{ 'wf-dtp-overlay': !p.ShowUpDown }"
|
||||
title="选择日期"
|
||||
:type="inputType"
|
||||
step="1"
|
||||
:value="nativeValue"
|
||||
:disabled="!enabled"
|
||||
tabindex="-1"
|
||||
@mousedown="nativeDown"
|
||||
@change="pick"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -365,6 +365,26 @@
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* 日期框透明地盖在下拉按钮上,日历图标撑满整个按钮,点它就由浏览器弹出选择框(见 DateTimePickerControl.vue) */
|
||||
.wf-dtp-native.wf-dtp-overlay {
|
||||
left: auto;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 17px;
|
||||
height: auto;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.wf-dtp-overlay::-webkit-calendar-picker-indicator {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* TrackBar:灰色轨道、刻度、蓝色滑块(Windows 10 样式) */
|
||||
.wf-trackbar {
|
||||
outline: none;
|
||||
|
||||
Reference in new issue
Block a user